目 录CONTENT

文章目录

后端返回数据给前端

Josue
2022-04-01 / 0 评论 / 0 点赞 / 326 阅读 / 986 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前后端分离开发模式下,前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端

1、返回格式

后端返回给前端一般用JSON体方式,定义如下:

{
    #返回状态码
    code:integer,       
    #返回信息描述
    message:string,
    #返回值
    data:object
}

2、CODE状态码

参考HTTP请求返回的状态码,下面是常见的HTTP状态码

200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
分类区间分类描述
1**100~199信息,服务器收到请求,需要请求者继续执行操作
2**200~299成功,操作被成功接收并处理
3**300~399重定向,需要进一步的操作以完成请求
4**400~499客户端错误,请求包含语法错误或无法完成请求
5**500~599服务器错误,服务器在处理请求的过程中发生错误

以参考这样的设计,这样的好处就把错误类型归类到某个区间内,如果区间不够,可以设计成4位数。

#1000~1999 区间表示参数错误
#2000~2999 区间表示用户错误
#3000~3999 区间表示接口异常

前端开发人员在得到返回值后,根据状态码就可以知道,大概什么错误,再根据message相关的信息描述,可以快速定位

3、Message

发生错误时,如何友好的进行提示。一般的设计是和code状态码一起设计,状态码和信息就会一一对应,比较好维护.

//状态码枚举
public enum ResultCode {

    //注意使用逗号分隔
    SUCCESS(1,"成功"),
    PARAM_IS_INVALID(1001,"参数无效"),
    PARAMISBLANK(1002,"参数为空"),
    PARAM_TYPE_BIND_ERROR(1003,"参数类型错误"),
    PARAMNOT_COMPLETE(1004,"参数缺失"),
    // 用户错误
    USERNOTLOGGED_IN(2001,"用户未登录,访问的路径需要验证,请登录"),
    USER_LOGIN_ERROR(2002,"账号不存在或密码错误"),
    USER_ACCOUNT_FORBIDDEN(2003,"账号已被禁用"),
    USER_NOT_EXIST(2004,"用户不存在" ),
    user_has_exits(2005,"用户已存在");
    
    private Integer code;
    private String message;

    ResultCode(Integer code,String message){
        this.code = code;
        this.message = message;
    }
    
}

4、Data

返回数据体,JSON格式,根据不同的业务又不同的JSON体。设计一个返回体类Result

@Data
public class Result implements Serializable {
    private Integer code;
    private String message;
    private Object data;

    public Result(ResultCode resultCode,Object data){
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
        this.data = data;
    }
    
}

5、Controller

在controller层处理业务请求,并返回给前端,以order订单为例

@RestController
@RequestMapping("/test")
public class Controller {
    @Autowired
    private UserService userService;

    @RequestMapping("/test1")
    public Result test1(){

        List user = userService.getUser();
        return new Result(ResultCode.SUCCESS,user);
    }
 }

image-20220401181759761

通过Result构造方法进行包装赋值,然后进行返回,这样的包装比较麻烦

5.1、优化

可以在Result类中,加入静态方法,方便快捷

@Data
public class Result implements Serializable {

    private Integer code;
    private String message;
    private Object data;
 //返回成功
    public static Result success(){
        Result result = new Result();
        result.setCode(ResultCode.SUCCESS.getCode());
        result.setMessage(ResultCode.SUCCESS.getMessage());
        return result;
    }
    //返回成功
    public static Result success(Object data){
        Result result = new Result();
        result.setCode(ResultCode.SUCCESS.getCode());
        result.setMessage(ResultCode.SUCCESS.getMessage());
        result.setData(data);
        return result;
    }
    //返回失败
    public static Result error(Object data){
        Result result = new Result();

        result.setCode(ResultCode.SUCCESS.getCode());
        result.setMessage(ResultCode.USER_LOGIN_ERROR.getMessage());
        result.setData(data);
        return result;
    }
//    ......示例...

    public Result message(String message){
        this.setMessage(message);
        return this;
    }

    public Result code(Integer code){
        this.setCode(code);
        return this;
    }

    public Result data(Object data){
        this.data = data;
        return this;
    }
}

5.2、Controller

@RestController
@RequestMapping("/test")
public class Controller {
    @Autowired
    private UserService userService;

    @RequestMapping("/test1")
    public Result test1(){

        List user = userService.getUser();
      //  改造
       // return new Result(ResultCode.SUCCESS,user);
        return Result.success().data(user);
    }
}
0

评论区