前后端分离开发模式下,前端和后端进行交互,前端按照约定请求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);
}
}
通过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);
}
}
评论区