前后端数据交互协议

在我们做spring boot项目中,往往会遇到前端接受后台的数据看不懂,格式乱,这也导致了前后端分离时,前端人员不理解后台传过来的错误数据,对此我们提出两种方案:

  1. 所有的数据、格式由前端写好。

  2. 由后端人员提前处理好,发送到前端。

那么我们来说一下第二种方式如何实现:

一、首先在表现层中定义Result类

public class Result {
    private Object data;//数据
    private Integer code;//状态码
    private String msg;//消息

    public Result() {
    }

    public Result(Object data, Integer code, String msg) {
        this.data = data;
        this.code = code;
        this.msg = msg;
    }

    public Result(Object data, Integer code) {
        this.data = data;
        this.code = code;
    }

    public Object getData() {
        return data;
    }

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

    public Integer getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

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

 二、创建ProjectExceptionAdvice类,这里使用了AOP编程(切面编程)

@RestControllerAdvice
public class ProjectExceptionAdvice {

    //ExceptiponHandler()里面填写异常类型
    @ExceptionHandler(SystemException.class)//系统异常
    public Result doSystemException(SystemException ex){
        //记录日志
        //发送邮件给开发人员
        //发送短信给运维人员
        return new Result(null,ex.getCode(),ex.getMessage());
    }
    @ExceptionHandler(BusinessException.class)//业务异常
    public Result doBusinessException(BusinessException ex){
        return new Result(null,ex.getCode(),ex.getMessage());
    }

    @ExceptionHandler(Exception.class)//其他异常
    public Result doException(Exception e){
        //记录日志
        //发送邮件给开发人员
        //发送短信给运维人员
        e.printStackTrace();
        return new Result(666,666,"出异常了");
    }
}

通过这样的方式,我们就可以在前端看到后台异常传过来的数据。

 当然,我们也要定义表现层返回的信息提示,做法如下:

创建Code类:

public class Code {
    public static final Integer SAVE_OK = 20011;
    public static final Integer DELETE_OK = 20021;
    public static final Integer UPDATE_OK = 20031;
    public static final Integer GET_OK = 20041;

    public static final Integer SAVE_ERR = 20010;
    public static final Integer DELETE_ERR = 20020;
    public static final Integer UPDATE_ERR = 20030;
    public static final Integer GET_ERR = 20040;

    public static final Integer BUSINESS_ERR = 50000;
    public static final Integer SYSTEM_UNKNOWN_ERR = 500001;
    public static final Integer SYSTEM_TIMEOUT_ERR = 500002;

}

这里面是我定义的增删改查以及业务、系统等异常的状态码。

在Controller中去实现:

举例:

//新增
@PostMapping
    public Result save(@RequestBody Book book) {
        boolean flag = bookService.save(book);
        return new Result(flag,flag?Code.SAVE_OK :Code.SAVE_ERR);
    }
//根据id查询
@GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        Book book = bookService.getById(id);
        Integer code = book != null ?Code.GET_OK :Code.GET_ERR;
        String msg = book != null ?"" : "数据查询失败,请重试!";
        return new Result(book,code,msg);
    }

以上就是对前后端数据交互的解决方法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小白程

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值