牛皮的程序猿后端返回值怎么界说

立山  金牌会员 | 2024-6-26 15:47:59 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

牛皮的程序猿后端返回值怎么界说
《用户中心》

在后端接口封装中,我们一般都会对返回的数据做一个封装,以防止系统出现不可预期的数据布局和范例。比如如许:
布局体 1
  1. {
  2.   "success": true,
  3.   "code": 200,
  4.   "message": "成功",
  5.   "data": {
  6.     "items": [
  7.       {
  8.         "id": "1",
  9.         "name": "小王",
  10.         "identified": "JavaPub博主"
  11.       }
  12.     ]
  13.   }
  14. }
复制代码
布局体 2
  1. {
  2.     "ret": 200,
  3.     "data": {
  4.         "title": "Default Api",
  5.         "content": "王哥 您好,欢迎使用 apifather!",
  6.         "version": "1.1.0",
  7.         "time": 14231428021
  8.     },
  9.     "msg": ""
  10. }
复制代码
不论怎样界说,多一个或少一个字段,我们都须要同一规范。接下来我们拆解一下,
首先,通过观察,一定要有状态码,也就是案例中的 code 和 ret ,通过状态码可以知道当前程序那里出了问题,比如 200 就是乐成。有同砚会问,为何不消 data 来判断,为空或者为 0 就是错误,当然不行。
比如:下面这个布局,data 长度虽然即是 0,但是这属于确实没查到数据,而不是程序出错。
  1. {
  2.     "ret": 200,
  3.     "data": [],
  4.     "msg": ""
  5. }
复制代码
再看 data,这个毋庸置疑,它是接口的焦点数据,也是接口对外提供的业务数据。
再看 message 或者称为 msg,它是给状态做一个笔墨说明。比如,有个老六在界说了一个状态码(666),第一次调用这个接口的同砚大概并不知道返回的状态码寄义、也不想去查接口文档,我加个描述:(老六的接口不通啦),调用者就一目了然了。
最后看 success 字段,这个字段是为了更规范而加的,方便前端直接将接口响应状态展示。比如:用户登录乐成,可以展示一个 true,或者前端在判断时也可以写更简洁的代码 if result.success:。毕竟将(老六的接口不通啦)描述直接展示出来显得不太正式。
基于以上几点,我们的返回布局如许界说:
ApiResponse.class
  1. // 定义API响应结构体
  2. public class ApiResponse<T> {
  3.     private int status; // HTTP状态码
  4.     private String message; // 状态信息
  5.     private T data; // 返回的数据,泛型支持返回不同类型的数据
  6.     // 构造函数
  7.     public ApiResponse(ResponseStatus status) {
  8.         this.status = status.getCode();
  9.         this.message = status.getMessage();
  10.     }
  11.     // 带数据的构造函数
  12.     public ApiResponse(ResponseStatus status, T data) {
  13.         this(status);
  14.         this.data = data;
  15.     }
  16.     // Getter和Setter方法
  17.     // ...
  18. }
复制代码
界说完返回布局后,我们须要界说状态的枚举值。这是为了定一个同一的规范,方便开辟时状态码搞混。
  1. // 定义状态码枚举
  2. public enum ResponseStatus {
  3.     SUCCESS(200, "操作成功"),
  4.     ERROR(500, "服务器内部错误"),
  5.     BAD_REQUEST(400, "请求参数错误"),
  6.     NOT_FOUND(404, "资源未找到"),
  7.     UNAUTHORIZED(401, "未授权"),
  8.     FORBIDDEN(403, "禁止访问");
  9.     private final int code;
  10.     private final String message;
  11.     ResponseStatus(int code, String message) {
  12.         this.code = code;
  13.         this.message = message;
  14.     }
  15.     public int getCode() {
  16.         return code;
  17.     }
  18.     public String getMessage() {
  19.         return message;
  20.     }
  21. }
复制代码
怎样使用呢
  1. @GetMapping("/users/{id}")
  2. public ResponseEntity<ApiResponse<User>> getUser(@PathVariable Long id) {
  3.     try {
  4.         User user = userService.getUserById(id);
  5.         if (user != null) {
  6.             return ResponseEntity.ok(new ApiResponse<>(ResponseStatus.SUCCESS, user));
  7.         } else {
  8.             return ResponseEntity.status(HttpStatus.NOT_FOUND)
  9.                                  .body(new ApiResponse<>(ResponseStatus.NOT_FOUND));
  10.         }
  11.     } catch (Exception e) {
  12.         // 这里可以根据异常类型返回不同的错误状态码和消息
  13.         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
  14.                              .body(new ApiResponse<>(ResponseStatus.ERROR));
  15.     }
  16. }
复制代码
这里使用了 Spring 自带的返回布局体 ResponseEntity 进行封装。
获取到的结果是如许的:
  1. {
  2.   "code": 200,
  3.   "message": "操作成功",
  4.   "data": {
  5.     "id": "1",
  6.     "name": "javapub",
  7.     "age": 18
  8.   }
  9. }
复制代码
原文地址: https://javapub.net.cn/star/project/user-center/

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表