首页 > 其他分享 >关于自定义R类-前后端数据交互协议

关于自定义R类-前后端数据交互协议

时间:2023-11-30 12:33:48浏览次数:39  
标签:code return String 自定义 data 前后 msg 交互 public

关于自定义R类-前后端数据交互协议


前言

这是我在学习前后端分离开发时遇到的一种前后端数据交互思想时的笔记记录,以便日后遗忘查阅;


目录

目录


一、什么是前后端数据交互协议

所谓前后端数据交互协议,其实就是将后端服务返回的结果封装到一个通用结果类中返回给前端服务。在这种情况下,前端接收的数据格式就是一个通用的结果类对象,可以有规律的去处理返回的数据结果。这种结果类就是前后端交互时所达成的一种数据交互协议。

二、如何自定义一个结果类

现在,我们知道我们所谓的前后端数据交互协议,其实本质上就是定义一个封装各种后端返回结果的结果类。我们暂且自定义一个R类来作为我们的结果类。

① 思考R类要包含哪些基础属性

  1. R类主要目的是分装各种数据类型的后端返回结果,那么首先我们要提供一个data属性用于接收待封装的实际数据。
  2. 既然我们把返回数据都封装成了一个R类,那么前端不管是响应成功还是失败都能拿到该R类。这种情况并不利于前端对返回数据是否符合要求的判断,所以我们要设置一个响应码属性(code),来用于前端判断响应状态。
  3. 响应码我们一般使用数字,例如1代表成功、0代表失败,但是实际开发中的响应状态并不止这些。当响应状态有10种或上百种,前端通过数字确定响应状态不太友好,所以一般我们还会设置响应码名称(codeName)来用于响应状态说明提示。
  4. 在开发的过程中,有时候会返回一些后端程序员给予的失败提示信息,或其他提示信息等。所以我们还需要信息属性(msg)用于封装提示信息。

② 设置响应状态码枚举

/**
 * 响应码
 *
 * @author zhao-XH
 * @version 1.0
 */
public enum RCodeEnum {
    SUCCESS(1, "SUCCESS", "成功"),
    FAIL(0, "FAIL", "失败");

    private final Integer code;

    private final String name;

    private final String description;

    RCodeEnum(Integer code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }

    public Integer getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

③ 自定义R类

/**
 * 前后端数据交互协议
 *
 * @param <D> 数据实体类型
 * @author zhao-XH
 * @version 1.0
 */
public class R<D> {
    private Integer code;   // 响应码
    private String codeName;    // 响应码名称
    private String msg; // 响应提示信息
    private D data; // 响应实际数据

    /**
     * 无返回数据响应成功
     *
     * @param <D>
     * @return
     */
    public static <D> R<D> success() {
        R<D> r = new R<>();
        r.setCode(RCodeEnum.SUCCESS.getCode());
        r.setCodeName(RCodeEnum.SUCCESS.getName());
        return r;
    }

    /**
     * 返回数据响应成功
     *
     * @param data
     * @param <D>
     * @return
     */
    public static <D> R<D> success(D data) {
        R<D> r = new R<>();
        r.setCode(RCodeEnum.SUCCESS.getCode());
        r.setCodeName(RCodeEnum.SUCCESS.getName());
        r.setData(data);
        return r;
    }

    /**
     * 无返回数据响应成功,并给出提示信息
     *
     * @param msg
     * @param <D>
     * @return
     */
    public static <D> R<D> successWithMsg(String msg) {
        R<D> r = new R<>();
        r.setCode(RCodeEnum.SUCCESS.getCode());
        r.setCodeName(RCodeEnum.SUCCESS.getName());
        r.setMsg(msg);
        return r;
    }

    /**
     * 返回数据响应成功,并给出提示信息
     *
     * @param data
     * @param msg
     * @param <D>
     * @return
     */
    public static <D> R<D> successWithDataAndMsg(D data, String msg) {
        R<D> r = new R<>();
        r.setCode(RCodeEnum.SUCCESS.getCode());
        r.setCodeName(RCodeEnum.SUCCESS.getName());
        r.setData(data);
        r.setMsg(msg);
        return r;
    }

    /**
     * 响应失败并给出提示信息
     *
     * @param msg
     * @param <D>
     * @return
     */
    public static <D> R<D> failWithMsg(String msg) {
        R<D> r = new R<>();
        r.setCode(RCodeEnum.FAIL.getCode());
        r.setCodeName(RCodeEnum.FAIL.getName());
        r.setMsg(msg);
        return r;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getCodeName() {
        return codeName;
    }

    public void setCodeName(String codeName) {
        this.codeName = codeName;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public D getData() {
        return data;
    }

    public void setData(D data) {
        this.data = data;
    }
}

三、测试

/**
 * 测试控制器
 */
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("testSuccess")
    public R testSuccess() {
        return R.success();
    }

    @GetMapping("testSuccessWithData")
    public R testSuccessWithData(){
        return R.success("hello,word!");
    }

    @GetMapping("testFail")
    public R testFail(){
        return R.failWithMsg("失败了");
    }

}

测试结果

请求:http://localhost:8080/test/testSuccess

结果:

{
    "code": 1,
    "codeName": "SUCCESS",
    "msg": null,
    "data": null
}

请求:http://localhost:8080/test/testSuccessWithData

结果:

{
    "code": 1,
    "codeName": "SUCCESS",
    "msg": null,
    "data": "hello,word!"
}

请求:http://localhost:8080/test/testFail

结果:

{
    "code": 0,
    "codeName": "FAIL",
    "msg": "失败了",
    "data": null
}

标签:code,return,String,自定义,data,前后,msg,交互,public
From: https://www.cnblogs.com/zhao-XH/p/17867043.html

相关文章

  • tita升级|考核流程支持自定义配置
    升级详情:“推荐你关注一下TitaOKR“1.考核流程中新增指标制定与确认流程Q1:在哪新增?小T:在考核模板的考核流程设置中,指标制定与指标确认流程节点有两种添加方式:1)考核模板中新增固定流程三,固定流程三为考核流程为“指标制定+指标确认+执行期+员工自评+同事评价+上级评价+绩效校......
  • 自定义标签
    1.在应用(如:app01)下创建文件夹templatetags再创建一个py文件,编写自定义标签(如:mytag) 2.编写自定义标签fromdjangoimporttemplateregister=template.Library()@register.filter(name="cut")defcut(value,arg):returnvalue.replace(arg,"")@register.filt......
  • 用户体验设计:产品设计从需求到交互 -01
    战略层面的用户体验设计这部分主要介绍了用户体验设计在产品战略层面的重要性。作者强调了在产品设计之初就考虑用户体验的重要性,并提出了一些关于产品定位、目标用户群体和产品愿景等方面的实用建议。读书笔记:在产品设计之初就考虑用户体验至关重要。用户体验不仅仅关乎产品的......
  • 用户体验设计:产品设计从需求到交互 -02
    范围层面的用户体验设计这部分聚焦于产品设计的范围层面。作者介绍了如何理解和定义用户需求、进行用户研究、创建用户故事和场景等内容。用户研究和需求定义在产品设计过程中扮演着关键角色,帮助将用户需求转化为可执行的产品设计方案。读书笔记:用户研究是理解用户需求的关键工......
  • 2-6 自定义模块、第三方模块、内置模块
    ​ 概要:自定义模块第三方模块内置模块 1.自定义模块 1.1模块和包importhashlib​​defencrypt(data):  """数据加密"""  hash_object=hashlib.md5()  hash_object.update(data.encode('utf-8'))  returnhash_object.hexdigest()......
  • FPGA 实现SPI 主机双工通信 CS前后肩可调 操作时钟频率可调 ,SPI模式可调,传输位宽可
    1//testbench2`timescale1ns/1ns3modulelcd_spi_m_tb();4regrst_n_i;5regspi_clkx_i;6reg[31:0]spi_data_i;7regspi_start;8regspi_miso_r1,spi_miso_r2;9wirespi_miso_i;10wire[0:0]spi_done;11wir......
  • Android项目实战(六十七):自定义圆形进度条
    圆形进度条支持设置:1、圆环背景颜色2、圆管背景宽度3、进度圆环颜色4、进度圆环宽度5、圆环进度6、开始角度7、动画执行时间 自定义类:packagecom.example.mainactivty;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.......
  • 2023-11-23-idea技巧-自定义后缀补全
    Idea技巧-PostfixCompletion在idea中可以使用.xxx进行后缀补全比如.sout如何自定义后缀补全?比如.log在idea中打开设置File|Settings|Editor|General|PostfixCompletion这里定义了上面提到的sout同理点击上图+号新建一个模板,并参考sout写入对应的规则效果......
  • 一些有用的自定义函数(抄录)
    提取字符串中的数字'提取字符串中的数字FunctionGetDigits(strTextAsString)AsStringDimstrCharAsString,strMsgAsStringDimiAsLongstrMsg=""Fori=1ToLen(strText)strChar=Mid(strText,i,1)IfstrCharLike"#"The......
  • SpringBoot JPA实践之EntityManage查询返回自定义DTO entityManager.createNativeQuer
    SpringBootJPA实践之EntityManage查询返回自定义DTOentityManager.createNativeQuery(sql)  在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与......