spring 定义统一返回结果,响应封装成统一的json返回
目的:将响应封装成json返回,将所有接口的数据格式统一, 使前端对数据的操作更一致。
1、数据格式的定义
我们希望返回给前端的数据格式:
{
"code": 0,
"message": "成功",
"data": 数据/null
}
定义返回结果的数据类型和格式:
{
"code": 数字, //业务响应码
"message": 字符串, //返回消息
"data": 对象 //返回数据
}
2、创建枚举
创建枚举 ResponseEnum
@Getter
@AllArgsConstructor
@ToString
public enum ResponseEnum {
SUCCESS(0, "成功"),
ERROR(-1, "服务器内部错误"),
;
// 响应状态码
private Integer code;
// 响应信息
private String message;
}
3、定义同统一结果类
@Data
public class R {
private Integer code;
private String message;
private Map<String, Object> data = new HashMap();
/**
* 构造器私有
*/
private R(){}
/**
* 返回成功
*/
public static R ok(){
R r = new R();
r.setCode(ResponseEnum.SUCCESS.getCode());
r.setMessage(ResponseEnum.SUCCESS.getMessage());
return r;
}
/**
* 返回失败
*/
public static R error(){
R r = new R();
r.setCode(ResponseEnum.ERROR.getCode());
r.setMessage(ResponseEnum.ERROR.getMessage());
return r;
}
/**
* 设置特定结果
*/
public static R setResult(ResponseEnum responseEnum){
R r = new R();
r.setCode(responseEnum.getCode());
r.setMessage(responseEnum));
return r;
}
//链式
public R message(String message){
this.setMessage(message);
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(String key, Object value){
this.data.put(key, value);
return this;
}
public R data(Map<String, Object> map){
this.setData(map);
return this;
}
}
4、使用统一返回结果
创建接口,访问/get/{id}路径时,返回查询结果。
//注入实现mybatis-puls接口的service层,用来查询数据
@Resource
private UserService userService;
@GetMapping("/get/{id}")
public R getById(@PathVariable Integer id){
User user = userService.getById(id);
if (user !=null ){
return R.ok().data("record",user);
}else {
return R.error().message("查询失败");
}
}
5、测试
成功
{
"code": 0,
"message": "成功",
"data": {
"record": {
"id": 2,
"name": "张三"
}
}
}
失败
{
"code": -1,
"message": "查询失败",
"data": {}
}