Result和ResultCode类,用于封装后端返回给前端的数据

打印 上一主题 下一主题

主题 1768|帖子 1768|积分 5304

统一响应处理


   在基于SpringBoot的前后端分脱离发模式下,后端程序员通常会更友好的返 回数据给前端,即统一返回数据的格式。通过统一的响应格式,可以提高前后端开辟的效率和协作的便利性。  思考:为什么要返回统一的标准格式?
一般情况下,SpringBoot的返回格式常见范例的有3种,


  • 第一种:返回 String
  1. @GetMapping("/getStr")
  2. public String getStr() {
  3.     return "Hello Java";
  4. }
复制代码


  • 第二种:返回自定义对象
  1. @GetMapping("/getObj")
  2. public Slideshow getObject() {
  3.         System.out.println("in getObject ...");
  4.         Slideshow slideshow = slideshowService.getOne(1);
  5.         return slideshow;
  6. }
复制代码
这两种方式调用接口获取到的返回值结果如下:



  • 第三种:接口出现异常
  1. @GetMapping("/error")
  2. public Object error(){
  3.         int i = 9 / 0;
  4.         return new Object();
  5. }
复制代码
运行结果如下:

基于以上种种情况,当我们和前端开辟人员联调接口他们会很懵逼,由于我们没有给他一个统一的格式,前端人员不知道如何处理返回值。以是我们项目中是必要定义一个统一的标准返回格式的。
一个标准的返回格式至少包含下面3部门:

  • code 状态值:由后端统一定义各种返回结果的状态码
  • message 描述:本次接口调用的结果描述
  • data 数据:本次返回的数据
Result封装了状态码,操作信息,响应数据

其中,状态码和操作信息已有枚举类 ResultCode
  1. package com.briup.product_source.result;
  2. import java.io.Serializable;
  3. /**
  4. * 统一Controller中RESTFul风格接口返回的结果
  5. */
  6. public class Result implements Serializable {
  7.         private static final long serialVersionUID = 1L;
  8.         private Integer code;
  9.         private String message;
  10.         private Object data;
  11.         public Result() {}
  12.         public Result(Integer code, String message) {
  13.                 this.code = code;
  14.                 this.message = message;
  15.         }
  16.         private void setResultCode(ResultCode code) {
  17.                 this.code = code.code();
  18.                 this.message = code.message();
  19.         }
  20.         /**
  21.          * 操作成功,没有返回的数据
  22.          */
  23.         public static Result success() {
  24.                 Result result = new Result();
  25.                 result.setResultCode(ResultCode.SUCCESS);
  26.                 return result;
  27.         }
  28.         /**
  29.          * 操作成功,有返回的数据
  30.          */
  31.         public static Result success(Object data) {
  32.                 Result result = new Result();
  33.                 result.setResultCode(ResultCode.SUCCESS);
  34.                 result.setData(data);
  35.                 return result;
  36.         }
  37.         /**
  38.          * 操作失败,没有返回的数据
  39.          */
  40.         public static Result failure(ResultCode resultCode) {
  41.                 Result result = new Result();
  42.                 result.setResultCode(resultCode);
  43.                 return result;
  44.         }
  45.         /**
  46.          * 操作失败,有返回的数据
  47.          */
  48.         public static Result failure(ResultCode resultCode, Object data) {
  49.                 Result result = new Result();
  50.                 result.setResultCode(resultCode);
  51.                 result.setData(data);
  52.                 return result;
  53.         }
  54.         /**
  55.          * 操作失败,自定义code和msg
  56.          */
  57.         public static Result failure(Integer code, String msg) {
  58.                 Result result = new Result(code,msg);
  59.                 return result;
  60.         }
  61.         public Integer getCode() {
  62.                 return code;
  63.         }
  64.         public void setCode(Integer code) {
  65.                 this.code = code;
  66.         }
  67.         public String getMessage() {
  68.                 return message;
  69.         }
  70.         public void setMessage(String message) {
  71.                 this.message = message;
  72.         }
  73.         public Object getData() {
  74.                 return data;
  75.         }
  76.         public void setData(Object data) {
  77.                 this.data = data;
  78.         }
  79. }
复制代码
ResultCode该类封装了固定的状态码和操作信息的枚举对象

  1. package com.briup.utils;
  2. /**
  3. * 统一并自定义返回状态码,如有需求可以另外增加
  4. */
  5. public enum ResultCode {
  6.         /* 成功状态码 */
  7.         SUCCESS(1, "操作成功"),
  8.         /* 参数错误:10001-19999 */
  9.         PARAM_IS_INVALID(10001, "参数无效"),
  10.         PARAM_IS_BLANK(10002, "参数为空"),
  11.         PARAM_TYPE_BIND_ERROR(10003, "参数类型错误"),
  12.         PARAM_NOT_COMPLETE(10004, "参数缺失"),
  13.         /* 用户错误:20001-29999*/
  14.         USER_NOT_LOGIN(20001, "用户未登录"),
  15.         USER_LOGIN_ERROR(20002, "账号不存在或密码错误"),
  16.         USER_ACCOUNT_FORBIDDEN(20003, "账号已被禁用"),
  17.         USER_NOT_EXIST(20004, "用户不存在"),
  18.         USER_HAS_EXISTED(20005, "用户已存在"),
  19.         /* 业务错误:30001-39999 */
  20.         SPECIFIED_QUESTIONED_USER_NOT_EXIST(30001, "业务逻辑出现问题"),
  21.         /* 系统错误:40001-49999 */
  22.         SYSTEM_INNER_ERROR(40001, "系统内部错误,请稍后重试"),
  23.         /* 数据错误:50001-599999 */
  24.         DATA_NONE(50001, "数据未找到"),
  25.         DATA_WRONG(50002, "数据错误"),
  26.         DATA_EXISTED(50003, "数据已存在"),
  27.         /* 接口错误:60001-69999 */
  28.         INTERFACE_INNER_INVOKE_ERROR(60001, "内部系统接口调用异常"),
  29.         INTERFACE_OUTTER_INVOKE_ERROR(60002, "外部系统接口调用异常"),
  30.         INTERFACE_FORBID_VISIT(60003, "该接口禁止访问"),
  31.         INTERFACE_ADDRESS_INVALID(60004, "接口地址无效"),
  32.         INTERFACE_REQUEST_TIMEOUT(60005, "接口请求超时"),
  33.         /* 权限错误:70001-79999 */
  34.         PERMISSION_NO_ACCESS(70001, "无访问权限");
  35.         private Integer code;
  36.         private String message;
  37.         ResultCode(Integer code, String message) {
  38.                 this.code = code;
  39.                 this.message = message;
  40.         }
  41.         public Integer code() {
  42.                 return this.code;
  43.         }
  44.         public String message() {
  45.                 return this.message;
  46.         }
  47. }
复制代码
上述标准写法,可以直接使用在自己的
下面是在学习中写的一个简朴的Result类:

此Result类可以应用于任何必要统一响应格式的后端服务中;定义一个统一的标准返回格式
  1. package com.briup.demo.response;
  2. import lombok.AccessLevel;  // 用于控制构造方法的访问级别
  3. import lombok.Builder;  // 用于生成构建器模式的代码
  4. import lombok.Getter;  // 用于生成属性的Getter方法
  5. /**
  6. * 所有给前端返回的响应数据的统一模型
  7. * 统一并自定义返回状态码,如有需求可以另外增加
  8. * @author YuYan
  9. * @date 2024-10-28 15:07:17
  10. *
  11. * 主要作用:用于封装后端向前端返回的响应数据,通过统一的响应格式
  12. * 通过状态码和消息来表示操作的结果,并可携带响应数据
  13. */
  14. // @Builder:使用lombok生成一个私有的构造器,方便创建Result对象
  15. @Builder(access = AccessLevel.PRIVATE)
  16. // @Getter:使用lombok为类的所有字段生成Getter方法
  17. @Getter
  18. public class Result {
  19.     private final static Integer SUCCESS = 1; // 成功的状态码
  20.     private final static Integer FAILURE = 0; // 失败的状态码
  21.     // 定义默认成功的和失败的消息
  22.     private final static String DEFAULT_SUCCESS_MESSAGE = "操作成功!";
  23.     private final static String DEFAULT_FAILURE_MESSAGE = "操作失败!";
  24.     // code:表示响应的状态码,0-失败,1-成功
  25.     private Integer code;
  26.     // 表示响应消息
  27.     private String message;
  28.     // 响应数据
  29.     private Object data;
  30.     // 静态方法:请求成功
  31.     public static Result success() {
  32.         return success(DEFAULT_SUCCESS_MESSAGE);
  33.     }
  34.     // 请求成功,指定自定义消息
  35.     public static Result success(String message) {
  36.         return success(message, null);
  37.     }
  38.     // 请求成功,默认消息为“操作成功”
  39.     public static Result success(Object data) {
  40.         return success(DEFAULT_SUCCESS_MESSAGE, data);
  41.     }
  42.     // 请求成功,返回一个成功的Result对象,指定自定义消息和响应数据
  43.     public static Result success(String message, Object data) {
  44.         return Result.builder()
  45.                 .code(SUCCESS)
  46.                 .message(message)
  47.                 .data(data)
  48.                 .build();
  49.     }
  50.     // 请求失败
  51.     public static Result failure() {
  52.         return failure(DEFAULT_FAILURE_MESSAGE);
  53.     }
  54.     // 返回一个失败的Result对象,指定自定义消息
  55.     public static Result failure(String message) {
  56.         return Result.builder()
  57.                 .code(FAILURE)
  58.                 .message(message)
  59.                 .build();
  60.     }
  61.     /**
  62.      * 该 Result 类定义了一个统一的响应格式,用于封装后端返回给前端的数据。通过状态码、操作信息和
  63.      * 响应数据的组合,确保所有接口返回的数据格式一致,便于前端解析和处理。
  64.      * Result类可以应用于任何需要统一响应格式的后端服务中,特别是在RESTful API开发
  65.      *
  66.      * 常见的应用场景包括:
  67.      * 1、用户登录:返回登录或失败的信息
  68.      * 2、数据查询:返回查询结果的状态信息
  69.      * 3、数据修改:返回修改操作的结果和状态信息
  70.      * 4、文件上传:返回上传结果和状态信息
  71.      */
  72.    
  73.     /**
  74.      * RESTful API是一种基于HTTP协议的Web服务接口设计风格。REST(Representation State Transfer)
  75.      * 代表 ”表现层状态转换“,其核心思想是通过标准的HTTP方法(如GET、POST、PUT、DELETE等)对
  76.      * 资源进行操作。RESTful API设计的目标是使Web服务更加简单、可扩展和易于理解。
  77.      *
  78.      */
  79. }
复制代码
作用与应用场景


  • 统一响应格式

    • 作用:确保所有接口返回的数据格式一致,便于前端剖析和处理。
    • 应用场景:适用于所有必要返回数据的接口,特别是在 RESTful API 开辟中。

  • 状态码和消息

    • 作用:通过状态码和消息明确告知前端操作的结果,便于前端根据不同的状态码举行相应的处理。
    • 应用场景:用户登录、数据查询、数据修改、文件上传等。

  • 响应数据

    • 作用:携带详细的响应数据,便于前端获取和展示。
    • 应用场景:查询结果、操作结果等。


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表