Result统一响应数据

2023-05-16

目录

1. 响应数据的格式

1.1 状态码划分

1.3 响应数据的封装

2. 统一数据返回


1. 响应数据的格式

在分离的环境中,我们前后交互就显得尤为重要。前端按照接口文档中的URL地址和参数要求发送请求,接着后端对业务进行处理就响应约定格式的数据,这种约定的格式常见如下:

  • 后端一般返回 JSON格式的数据

{

     "code": 200,

     "message": "Success !",

     "data":{}

}

1.1 状态码划分

当然这个 code 各自有不同的规范,可以参考HTTP的状态码进行区间划分

    /**
     200 - 00 请求成功,已经正常处理完毕
     301 - 00 请求永久重定向,转移到其它URL
     302 - 00 请求临时重定向
     304 - 00 请求被重定向到客户端本地缓存
     ---数据校验---
     400 - 00 客户端请求存在语法错误
     400 - 01 客户端请求参数校验异常
     400 - 02 用户不存在,请注册
     400 - 03 用户被锁定 ,请联系管理员
     400 - 04 用户或密码不正确 ,请重新登录

     401 - 01 token为空,请重新登录
     401 - 02 token校验失败,请重新登录
     401 - 03 该账号被锁定,请联系系统管理员
     401 - 04 该账号已被删除,请联系系统管理员
     401 - 05 token失效,请刷新token

     ---无权限---
     403 - 01 客户端的请求被服务器拒绝,一般为客户端没有访问权限

     ---服务器异常---
     500 - 00 服务端永久错误
     */
 


1.2 状态码的封装
 

我们常用枚举来进行状态码及其提示的统一封装,便于管理

public enum  BaseResponseCode{
    
    SUCCESS(200,"请求成功!"),

    ;
    BaseResponseCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 响应状态码
     */
    private final int code;
    /**
     * 响应提示
     */
    private final String msg;

    
    public int getCode() {
        return code;
    }

    
    public String getMsg() {
        return msg;
    }
}

1.3 响应数据的封装

将数据统一封装成响应数据,简洁明了

package com.example.demo.util;

import com.example.demo.exception.code.BaseResponseCode;
import com.example.demo.exception.code.ResponseCodeInterface;
import io.swagger.annotations.ApiModelProperty;

/**
 * @ClassName DataResult
 * @Description TODO
 * @Author LiuY
 * @Date 2020/12/5 16:45
 */
public class DataResult<T> {

    @ApiModelProperty("响应状态码")
    private int code;
    @ApiModelProperty("响应提示")
    private String  msg;
    @ApiModelProperty("响应数据")
    private T data;

    public DataResult(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public DataResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public DataResult(ResponseCodeInterface responseCodeinterface){
        this.code=responseCodeinterface.getCode();
        this.msg=responseCodeinterface.getMsg();
        this.data=null;
    }
    public DataResult(ResponseCodeInterface responseCodeinterface,T data){
        this.code=responseCodeinterface.getCode();
        this.msg=responseCodeinterface.getMsg();
        this.data=data;
    }

    /**
     * 操作成功,data为null
     */
    public DataResult(){
        this.code= BaseResponseCode.SUCCESS.getCode();
        this.msg=BaseResponseCode.SUCCESS.getMsg();
        this.data=null;
    }

    /**
     * 请求成功,返回data
     * @param data
     */
    public DataResult(T data){
        this.code=BaseResponseCode.SUCCESS.getCode();
        this.msg=BaseResponseCode.SUCCESS.getMsg();
        this.data=data;
    }

    /**
     * 自定义返回,无需data
     * @param code 响应状态码
     * @param msg 响应提示语
     * @return
     */
    public static DataResult getResult(int code, String msg){
        return new DataResult(code,msg);
    }


    /**
     * 自定义data返回
     * @param code 响应状态码
     * @param msg  响应提示语
     * @param data 响应数据
     * @param <T>
     * @return DataResult
     */
    public static <T> DataResult getResult(int code, String msg, T data){
        return new DataResult(code,msg,data);
    }

    /**
     * 自定义返回,一般返回异常时调用,data为null
     * @param baseResponseCode
     * @return
     */
    public static DataResult getResult(BaseResponseCode baseResponseCode){
        return new DataResult(baseResponseCode);
    }

    /**
     * 自定义返回,一般返回异常时调用
     * @param baseResponseCode
     * @param data
     * @param <T>
     * @return
     */
    public static <T> DataResult getResult(BaseResponseCode baseResponseCode,T data){
        return new DataResult(baseResponseCode,data);
    }


    /**
     * 请求成功时调用,data为null
     * @return
     */
    public static DataResult success(){
        return new DataResult();
    }

    /**
     * 请求成功,需要返回data
     * @param data
     * @param <T>
     * @return
     */
    public static <T> DataResult success(T data){
        return new DataResult(data);
    }
}

2. 统一数据返回

@RestController
@RequestMapping("/api/user")
@Api(tags = "用户模块接口")
@Slf4j
public class UserController {

    @Autowired
    UserService userService;

    @PostMapping("/login")
    @ApiOperation("用户登录接口")
    public DataResult<LoginRespVO> login(@Valid @RequestBody LoginReqVO vo){
        return DataResult.success(userService.login(vo));
    }

}
    {"code":"20000","msg":"成功","data":null}

    {"code":"20000","msg":"成功","data":{"name":null,"age":0}}

    {"code":"50000","msg":"服务端错误","data":null}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Result统一响应数据 的相关文章

随机推荐

  • canvas插件 fabric.js 使用

    fabric js使用 fabric js 是 常用的 canvas 插件1 在项目中使用2 特殊用法 基本设置 画板数据的导入导出 遮罩 Pattern 引用官网案例 多个对象合并 并设置为 fabric 背景 适用于变色和更多场景 把
  • 前端 百度地图 javascript api 在线地图, 离线地图

    前端 百度地图 javascript api 在线地图 离线地图 在线地图登录百度api获取key注册为个人开发者后 创建应用 离线地图 瓦片地图 下载离线瓦片地图二 下载api js 一些常用api难找见的api 在线地图 在线地图 百度
  • 基于 jquery imagesloaded masonry 实现的瀑布流图片展示

    基于 jquery imagesloaded masonry 实现的瀑布流图片展示 基于 jquery imagesloaded masonry 实现的瀑布流图片展示简述 xff0c 版本 xff0c 及插件案例htmlcssjs 基于 j
  • 微信小程序开发双重for循环, wx: if else 语法

    微信小程序开发 双重for循环 多重for循环 重点在于 wx for item 61 34 problemItem 34 和 wx for index 61 34 idx 34 确定循环的 item 和index 理论上可以实现无上线条循
  • react hocks ggeditor 脑图开发(双向细目表), 实用技巧

    ggeditor脑图开发 目录 配置说明api介绍 xff0c 引入插件 xff0c 获取api xff08 withPropsAPI xff09 xff0c 获取node api xff0c 常用api汇总 xff0c 绑定事件功能实现
  • TX2开发板CMake Error at CMakeLists.txt:11 (message): FATAL: In-source builds are not allowed.

    因为之前已经cmake过 把之前cmake生成的build目录中的文件 xff0c 以及opencv目录下生成的CmakeCache txt删除就可以解决了
  • 玩客云刷ARMBIAN当服务器过程记录

    玩客云的可玩性 1 可以刷成电视 43 游戏盒子的双系统 也可以刷成单独的电视盒子和游戏盒子 不过因为内存有限放不了多少游戏 还是建议用外置SD卡存储游戏比较合适 2 刷成Armbian linux系统 xff08 可以实现docker 可
  • Android9.0从系统层面修改android_id

    原因 按照android官方说明 xff0c android id会随着恢复出厂设置或重新烧录系统 xff0c 或切换用户登陆都会重新随机生成新的anroid id 因此对于一些依赖anroid id做唯一识别标识之一的软件来说就有问题了
  • Linux系统下基于Docker安装Yapi,并且迁移Yapi数据

    本文主要讲四个部分 xff1a 1 什么是Yapi 2 Centos7 下基于docker安装Yapi 3 Yapi数据迁移 4 利用Nginx反向代理 什么是Yapi YApi 是高效 易用 功能强大的 api 管理平台 xff0c 旨在
  • C语言多文件编程基本格式

    1 背景 xff1a 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2 格式 xff08 1 xff09 主函数文件main c 文件头part1 所有要使用的函数 include include include 文件头part2 放
  • STM32汇编程序及点灯实验

    目录 一 Keil下编写汇编程序1 新建工程2 配置环境3 测试代码 二 HEX文件格式说明1 简介2 格式说明3 举例说明 上述工程生成的 hex文件 三 基于STM32 汇编每间隔1秒钟闪烁一次LED的程序 一 Keil下编写汇编程序
  • c++单向链表逆序

    include lt iostream gt using namespace std struct node int data node next node createlist int n 创建一个链表 xff0c n为存储的数据个数 n
  • 目标检测6--NanodetPlus算法分析

    文章目录 1 简介2 辅助训练模块Assign Guidance Module3 损失函数4 标签匹配策略5 后处理介绍6 特征融合参考资料 欢迎访问个人网络日志 x1f339 x1f339 知行空间 x1f339 x1f339 1 简介
  • Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server

    在使用 Mastering ROS for Robotics Programming PACKT 2015 学习ros xff0c 学习到第四章的时候 xff0c 先是安装Navigation一直找不到dependencies 换了源进行u
  • Linux之索引节点inode(index node)

    inode就是索引节点 xff0c 它用来存放档案及目录的基本信息 xff0c 包含时间 档名 使用者及群组等 inode 是 UNIX Linux 操作系统中的一种数据结构 xff0c 其本质是结构体 它包含了与文件系统中各个文件相关的一
  • String、StringBuffer、Stringbulider的区别

    java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBuilder 三者共同之处 都是final类 不允许被继承 xff0c 主要是从性能和
  • 常用集合List、Set、Map的比较

    概述 List Set Map都是接口 xff0c 前两个继承至Collection接口 xff0c Map为独立接口 List有序 xff0c 可重复 1 ArrayList 底层 xff1a 数组 xff1b 查询快 xff0c 增删慢
  • Apache中的默认编码

    好吧 xff0c 在Django上测试挺好的GBK编码的静态文件 xff0c 部署到Apache后乱码了 xff0c 默认编码变成了UTF 8 xff0c 可是meta中明明指定了charset为GBK的 xff1a lt meta htt
  • SpringDoc使用

    文章目录 1 SpringDoc简介2 SpringDoc基础使用 1 SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具 2 SpringDoc基础使用 POM文件 span class
  • Result统一响应数据

    目录 1 响应数据的格式 1 1 状态码划分 1 3 响应数据的封装 2 统一数据返回 1 响应数据的格式 在分离的环境中 xff0c 我们前后交互就显得尤为重要 前端按照接口文档中的URL地址和参数要求发送请求 xff0c 接着后端对业务