写点什么

统一返回结果

作者:卢卡多多
  • 2022 年 6 月 18 日
  • 本文字数:2567 字

    阅读完需:约 8 分钟

统一返回结果


一、统一返回数据格式

项目中我们会将响应封装成 json 返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。


一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容


例如,我们的系统要求返回的基本数据格式如下:


列表:


{
复制代码


  "success": true,
复制代码


  "code": 20000,
复制代码


  "message": "成功",
复制代码


  "data": {
复制代码


    "items": [
复制代码


      {
复制代码


        "id": "1",
复制代码


        "name": "刘德华",
复制代码


        "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"
复制代码


      }
复制代码


    ]
复制代码


  }
复制代码


}
复制代码


分页:


{
复制代码


  "success": true,
复制代码


  "code": 20000,
复制代码


  "message": "成功",
复制代码


  "data": {
复制代码


    "total": 17,
复制代码


    "rows": [
复制代码


      {
复制代码


        "id": "1",
复制代码


        "name": "刘德华",
复制代码


        "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"
复制代码


      }
复制代码


    ]
复制代码


  }
复制代码


}
复制代码


没有返回数据:


{
复制代码


  "success": true,
复制代码


  "code": 20000,
复制代码


  "message": "成功",
复制代码


  "data": {}
复制代码


}
复制代码


失败:


{
复制代码


  "success": false,
复制代码


  "code": 20001,
复制代码


  "message": "失败",
复制代码


  "data": {}
复制代码


}
复制代码


因此,我们定义统一结果


{
复制代码


  "success": 布尔, //响应是否成功
复制代码


  "code": 数字, //响应码
复制代码


  "message": 字符串, //返回消息
复制代码


  "data": HashMap //返回数据,放在键值对中
复制代码


}
复制代码

二、定义统一返回结果

1、创建返回码定义枚举类

在 guli-framework-common 中创建包 com.guli.common.constants,创建枚举类 ResultCodeEnum.java


package com.guli.common.constants;
复制代码


import lombok.Getter;
复制代码


 
复制代码


@Getter
复制代码


public enum ResultCodeEnum {
复制代码


 
复制代码


    SUCCESS(true, 20000,"成功"),
复制代码


    UNKNOWN_REASON(false, 20001, "未知错误"),
复制代码


 
复制代码


    BAD_SQL_GRAMMAR(false, 21001, "sql语法错误"),
复制代码


    JSON_PARSE_ERROR(false, 21002, "json解析异常"),
复制代码


    PARAM_ERROR(false, 21003, "参数不正确"),
复制代码


 
复制代码


    FILE_UPLOAD_ERROR(false, 21004, "文件上传错误"),
复制代码


    FILE_DELETE_ERROR(false, 21005, "文件刪除错误"),
复制代码


    EXCEL_DATA_IMPORT_ERROR(false, 21006, "Excel数据导入错误"),
复制代码


 
复制代码


    VIDEO_UPLOAD_ALIYUN_ERROR(false, 22001, "视频上传至阿里云失败"),
复制代码


    VIDEO_UPLOAD_TOMCAT_ERROR(false, 22002, "视频上传至业务服务器失败"),
复制代码


    VIDEO_DELETE_ALIYUN_ERROR(false, 22003, "阿里云视频文件删除失败"),
复制代码


    FETCH_VIDEO_UPLOADAUTH_ERROR(false, 22004, "获取上传地址和凭证失败"),
复制代码


    REFRESH_VIDEO_UPLOADAUTH_ERROR(false, 22005, "刷新上传地址和凭证失败"),
复制代码


    FETCH_PLAYAUTH_ERROR(false, 22006, "获取播放凭证失败"),
复制代码


 
复制代码


    URL_ENCODE_ERROR(false, 23001, "URL编码失败"),
复制代码


    ILLEGAL_CALLBACK_REQUEST_ERROR(false, 23002, "非法回调请求"),
复制代码


    FETCH_ACCESSTOKEN_FAILD(false, 23003, "获取accessToken失败"),
复制代码


    FETCH_USERINFO_ERROR(false, 23004, "获取用户信息失败"),
复制代码


    LOGIN_ERROR(false, 23005, "登录失败");
复制代码


 
复制代码


 
复制代码


    private Boolean success;
复制代码


 
复制代码


    private Integer code;
复制代码


 
复制代码


    private String message;
复制代码


 
复制代码


    private ResultCodeEnum(Boolean success, Integer code, String message) {
复制代码


        this.success = success;
复制代码


        this.code = code;
复制代码


        this.message = message;
复制代码


    }
复制代码


}
复制代码

2、创建结果类

创建包 com.guli.common.vo,创建类 R.java\


vo:View Object


package com.guli.common.vo;
复制代码


 
复制代码


@Data
复制代码


@ApiModel(value = "全局统一返回结果")
复制代码


public class R {
复制代码


 
复制代码


    @ApiModelProperty(value = "是否成功")
复制代码


    private Boolean success;
复制代码


 
复制代码


    @ApiModelProperty(value = "返回码")
复制代码


    private Integer code;
复制代码


 
复制代码


    @ApiModelProperty(value = "返回消息")
复制代码


    private String message;
复制代码


 
复制代码


    @ApiModelProperty(value = "返回数据")
复制代码


    private Map<String, Object> data = new HashMap<String, Object>();
复制代码


 
复制代码


    private R(){}
复制代码


 
复制代码


    public static R ok(){
复制代码


        R r = new R();
复制代码


        r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
复制代码


        r.setCode(ResultCodeEnum.SUCCESS.getCode());
复制代码


        r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
复制代码


        return r;
复制代码


    }
复制代码


 
复制代码


    public static R error(){
复制代码


        R r = new R();
复制代码


        r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());
复制代码


        r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());
复制代码


        r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());
复制代码


        return r;
复制代码


    }
复制代码


 
复制代码


    public static R setResult(ResultCodeEnum resultCodeEnum){
复制代码


        R r = new R();
复制代码


        r.setSuccess(resultCodeEnum.getSuccess());
复制代码


        r.setCode(resultCodeEnum.getCode());
复制代码


        r.setMessage(resultCodeEnum.getMessage());
复制代码


        return r;
复制代码


    }
复制代码


 
复制代码


    public R success(Boolean success){
复制代码


        this.setSuccess(success);
复制代码


        return this;
复制代码


    }
复制代码


 
复制代码


    public R message(String message){
复制代码


        this.setMessage(message);
复制代码


        return this;
复制代码


    }
复制代码


 
复制代码


    public R code(Integer code){
复制代码


        this.setCode(code);
复制代码


        return this;
复制代码


    }
复制代码


 
复制代码


    public R data(String key, Object value){
复制代码


        this.data.put(key, value);
复制代码


        return this;
复制代码


    }
复制代码


 
复制代码


    public R data(Map<String, Object> map){
复制代码


        this.setData(map);
复制代码


        return this;
复制代码


    }
复制代码


}
复制代码

二、统一返回结果

1、修改 Controller 中的返回结果

修改 guli-microservice-edu 的 TeacherAdminController\


列表


@ApiOperation(value = "所有讲师列表")
复制代码


@GetMapping
复制代码


public R list(){
复制代码


    List<Teacher> list = teacherService.list(null);
复制代码


    return R.ok().data("items", list);
复制代码


}
复制代码


删除


@ApiOperation(value="根据id删除讲师")
复制代码


@DeleteMapping("{id}")
复制代码


public R removeById(
复制代码


    @ApiParam(value = "讲师id", name = "id", required = true)
复制代码


    @PathVariable String id){
复制代码


    boolean result = teacherService.removeById(id);
复制代码


    if(result){
复制代码


        return R.ok().message("删除讲师成功");
复制代码


    }else{
复制代码


        return R.error().message("删除讲师失败");
复制代码


    }
复制代码


}
复制代码

2、重启测试

发布于: 刚刚阅读数: 3
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习 2021年度优质创作者

评论

发布
暂无评论
统一返回结果_返回值_卢卡多多_InfoQ写作社区