优雅地设计一个Restful响应体类(结构体)——R


highlight: xcode

theme: vuepress

简介

今天给大家介绍一下如何设计一个业务数据响应体类,就是前端每次请求后端返回的数据我们要统一数据结构, 不能想怎么写就怎么写。规定一个通用的后端数据响应体类十分必要。

响应体类R

其实也很简单,只需要声明一个类,随便你叫什么。RResultRestResponse 都行啦,我这边为了简洁声明为了 R 类。

R 类有 3 个属性,分别是:

  • code:Integer 类型,业务状态码,每种错误都对应着一个业务错误码或者状态码,由项目团队自定义。
  • msg:String 类型,给前端返回的消息,提示文字。
  • data:类型是泛型类 T,用于保存要返回的数据,根据最终要返回的数据类型而定。比如说要返回 List<String>,那么最终 Controller 层方法返回值就可以写成 R<List<String>>

R 类中还定义了一些常量,比如说提示消息,业务状态码,这个可以根据自身的业务而定。每家公司的业务标准都不太一样。

```java @Data public class R {

private Integer code = NORMAL_CODE;private String msg = "";private T data;public static final String SUCCESS = "操作成功";public static final String FAILURE = "操作失败";public static final Integer ERROR_CODE = 500;public static final Integer NORMAL_CODE = 200;public R() {}public R(T data) {this.data = data;
}public R(Integer code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;
}public static <T> R<T> ok() {return ok(HttpStatus.HTTP_OK, SUCCESS, null);
}public static <T> R<T> ok(Integer code, String msg, T data) {R<T> r = new R<>();r.setCode(code);r.setMsg(msg);r.setData(data);return r;
}public static <T> R<T> ok(T data) {return ok(ERROR_CODE, SUCCESS, data);
}public static <T> R<T> fail(Integer code, String msg) {return ok(code, msg, null);
}public static <T> R<T> fail(String msg) {return ok(ERROR_CODE, msg, null);
}public static <T> R<T> fail() {return ok(ERROR_CODE, FAILURE, null);
}

} ```

接口示例代码

下面演示一下接口的示例代码,以 UserController 为例,声明一个 UserController 类,标记为 @RestController

```java @RestController @RequestMapping("/user") public class UserController {

private UserService userService;// 构造器注入
@Autowired
public UserController(UserService userService) {this.userService = userService;
}@GetMapping("/list")
public R<List<User>> selectAll() {List<User> list = userService.selectAll();return R.ok(list);
}

} ```

最后响应的结果应该是这样:

json { code: 200, msg: "操作成功", data: [ { id: 1, username: "特朗普", age: 80 }, // ... ] }

前端一般这样处理获得数据:

```js // 导入封装的查询接口 import { getUserListAPI } from '@/api/user.js'

async function getUserList() { // 结构出 data 字段,axios 需要在后置处理器配置直接返回 AxiosResponse 的 data 字段 // 这样我们才能拿到我们自己定义的响应体,最后解构出我们自己定义的响应体的 data 字段 // 如果担心名称重复可以使用 : 符号重命名 const { data } = await getUserListAPI()

// 赋值之后,自动触发组件刷新
userList.value = data

} ```

其他语言版本的

如果你的后端使用了 Go 开发,那么可以如法炮制。定义一个结构体 R

go type R[T any] struct { Code int `json:code` Msg string `json:msg` Data T `json:data` }

现在 Go 里面也可以使用泛型了,泛型类型约束为 any,也就是任意类型。Go 语言中不存在什么静态方法,可以自定义函数,但是大可不必,Go 语言的结构体使用起来就是强调一个简洁,跟 JS 的对象字面写法很类似。

下面演示一下在 Gin 框架里面使用响应体结构体 R

```go type UserController struct { userService *UserService }

// wire 构造器注入 // 设置 Gin 的路由不作赘述 func NewUserController(userService UserService) *UserController { return &UserController{userService: &userService} }

func (c *UserController) getUserList(ctx *gin.Context) { // 返回 User 的切片 users := c.userService.getUserList() r := R[User[]]{ code: 200, msg: "操作成功", data: users } ctx.JSON(200, r) } ```

怎么样,你学会了吗?😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟

strcpy的使用和模拟&#xff08;作用&#xff09; 将一个字符串的内容复制到另外一个字符串中代替掉。 strcpy的使用效果 #include <stdio.h> #include <string.h>int main () {char str1[]"Sample string";char str2[40];char str3[40];strcpy (str2…

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础&#xff0c;且对面向对象有一定了解者观看 文章目录 数据类型字面量数字类型数据容器字符串列表元组 type()方法数据类型强转 注释单行注释多行注释 输出基本输出连续输出&#xff0c;中间用“,”分隔更复杂的输出格式 变量定义del方法 标识符…

网页实现输入固定前缀,以及打开数量打开固定数量的网页

网页实现输入固定前缀&#xff0c;以及打开数量打开固定数量的网页 废话不多说直接上代码 今天客户说要写一个小需求&#xff1a; 我这边需求是帮我编写一个小程序或者是批处理文件&#xff0c;实现尾数连续的链接打开 例如http://abc1.com,后续依次自动打http://abc2.com,http…

nginx搭建简单负载均衡demo(springboot)

目录 1 安装nignx 1.1 执行 brew install nginx 命令&#xff08;如果没安装brew可百度搜索如何安装brew下载工具。类似linux的yum命令工具&#xff09;。 1.2 安装完成会有如下提示&#xff1a;可以查看nginx的配置文件目录。 1.3 执行 brew services start nginx 命令启动…

9秒爬取庆余年2分集剧情

版本一: 要创建一个Python爬虫程序来爬取指定网站的分集剧情,我们需要使用requests库来发送HTTP请求,以及BeautifulSoup库来解析HTML内容。以下是一个简单的示例,展示了如何爬取你提供的网站的分集剧情,并将每集剧情保存到本地的.txt文件中。 首先,确保你已经安装了req…

if语句知识点

作用 让顺序执行的代码产生分歧。 if 语句 作用&#xff1a;满足条件时&#xff0c;多执行一些代码。 语法&#xff1a; if(bool类型值)//bool类型相关&#xff1a;bool变量&#xff0c;条件运算符表达式&#xff0c;逻辑运算符表达式 {满足条件要执行的代码&#xff0c;写在…

遍历路径,统计每个文件大小

功能&#xff1a;统计&#xff08;参数&#xff09;路径下每个文件大小&#xff0c;记录属主&#xff0c;并且不统计超链接的文件和文件夹。 #!/bin/bash# 定义函数来递归遍历文件夹 function traverse_directory {local directory"$1"# 遍历目录下的文件和子目录fo…

将三个字符串通过strcat连接起来并打印输出

将三个字符串通过strcat连接起来并打印输出 #include <stdio.h> #include <string.h> int main () { char a[10]"I", b[10]" am",c[10]" happy"; strcat(a,b); strcat(a,c); printf("%s",a); printf("\n"); re…

Java | Leetcode Java题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProfit(int[] prices) {int n prices.length;int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 Math.max(buy1, -prices[i]);sell1 Math.max(sell1, b…

python程序控制结构

文章目录 一、python程序控制结构介绍二、顺序结构2.1、print()函数2.2、end参数2.3、input()函数 三、选择结构3.1选择结构的用途 四、循环结构4.1循环结构的构造4.1.1、循环结构的三个要素4.1.2、循环结构的一个要求4.1.3、循环结构的一个关系 4.2、循环语句4.2.1、while语句…

zynq PS点灯

摸鱼碎碎念&#xff1a; 需要做ADC采集并在TFT屏幕实时显示波形&#xff08;简易示波器&#xff09; 发现只使用fpga实现比较困难 使用的是zynq&#xff0c;刚好来把arm部分也学到 参考视频 与 教材文档 01_Zynq SoC FPGA的诞生_哔哩哔哩_bilibili (这是俺点开AXI4接口协…

爬虫学习2

中国国家地理网 单张图片爬取 import requests url http://img0.dili360.com/ga/M00/02/AB/wKgBzFQ26i2AWujSAA_-xvEYLbU441.jpg!rw9 headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0…

解锁 JavaScript ES6:函数与对象的高级扩展功能

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 ES6函数扩展1 默认参数1.1 之前写法1.2 ES6 写法1.3 注意点 2 …

基于VGG16使用图像特征进行迁移学习的时装推荐系统

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

解决Vscode Copilot连不上网问题

这段时间Copilot突然连不上网&#xff0c;修改vscode的proxy固然好使&#xff0c;但是还是不能从根本解决问题&#xff0c;并且会带来诸多问题&#xff0c;比如用vscode打开服务器这个proxy就失效了等等… 今天看到一种方法&#xff0c;很好的解决了我的问题。 直接修改本机的h…

【vue+ts】性能优化,defer优化白屏

代码&#xff1a; import {ref} from vueexport function useDefer(maxCount 100) {const count ref(0)let raqId:any null;function updateFrame() {count.valueif (count.value > maxCount) {return;}raqId requestAnimationFrame(updateFrame)}updateFrame();onUnmo…

【React篇】简述React-Router 的实现原理及工作方式

React Router 路由的基础实现原理分为两种&#xff0c;如果是切换 Hash 的方式&#xff0c;那么依靠浏览器 Hash 变化即可&#xff1b;如果是切换网址中的 Path&#xff0c;就要用到 HTML5 History API 中的 pushState、replaceState 等。在使用这个方式时&#xff0c;还需要在…

如何使用AES128位进行视频解密

要实现AES128位加解密&#xff0c;可以使用JavaScript的crypto-js库。以下是一个简单的示例&#xff1a; HTML代码&#xff1a; <video controlsList"nodownload" controls></video> 首先&#xff0c;需要安装crypto-js库&#xff1a; npm install cr…

数据库管理软件:Navicat Premium 17 中文激活版

Navicat Premium 是一套可创建多个连接的数据库开发工具&#xff0c;让你从单一应用程序中同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 。它与 OceanBase 数据库及 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Clo…

Linux基础指令目录管理001

Linux目录管理是Linux操作系统中的一项基本而重要的任务&#xff0c;涉及到创建、删除、移动、查看和修改目录结构。 操作系统&#xff1a; CentOS Stream 操作命令&#xff1a; mkdir 创建目录 [rootlocalhost ~]# mkdir 秘密 [rootlocalhost ~]# ls -lhrt 总用量 1.2M …