前后端分离项目中后端开发需要写相应的接口,定义统一的返回格式有利于提高开发效率和沟通的成本。通常返回的格式主要如下两种:
1.    只返回相应的状态,格式如下:

{     "code": "200",     "msg": "SUCCESS" }

 2.    返回相应的状态及数据,格式如下:

{     "code": "200",     "msg": "查询成功",     "result": {         "id": 10,         "name": "张三",         "emil": "1234456@qq.com",         "phone": null,         "address": "测试地址"     } }

 状态代码定义如下:
   code : 请求处理状态

  •       200: 请求处理成功
  •       400: 请求处理失败
  •       500: 服务器内部错误
  •       401未认证(签名错误)
  •       404接口不存在

Springboot中我们可以使用泛型来定义统一的返回结果:
1. 先定义只返回状态的Result

package com.example.demo.base;  import com.alibaba.fastjson.JSON;  public class Result {     private String code;     private String msg;      public String getCode() {         return code;     }      public void setCode(String code) {         this.code = code;     }      public String getMsg() {         return msg;     }      public void setMsg(String msg) {         this.msg = msg;     }      @Override     public String toString() {         return JSON.toJSONString(this);     } }

定义即有数据又有返回状态的DateResult

package com.example.demo.base;  import java.io.Serializable;  public class DateResult<T> extends Result implements Serializable {     private T result;      public T getResult() {         return (T) result;     }      public void setResult(T result) {         this.result = result;     }  }

定义响应码枚举

package com.example.demo.base;  /**  * 响应码枚举  */ public enum ResultCode {     SUCCESS("200"), //成功     FAIL("400"), //失败     UNAUTHORIZED("401"), //未认证(签名错误)     NOT_FOUND("404"), //接口不存在     INTERNAL_SERVER_ERROR("500");//服务器内部错误      private final String code;      ResultCode(String code) {         this.code = code;     }      public String code() {         return code;     } }

 在Controller类中使用方法如下:

package com.example.demo.controller;  import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;  import com.example.demo.base.DateResult; import com.example.demo.base.Result; import com.example.demo.base.ResultCode; import com.example.demo.entity.User;  @RestController @RequestMapping("/user") public class UserController {     @PostMapping("/update")     public Result updateUser(@RequestParam Integer id) {         Result result = new Result();         //相应的逻辑更新逻辑......... 假如更新成功         result.setCode(ResultCode.SUCCESS.code());         result.setMsg("更新成功");         return result;     }      @RequestMapping("/detail")     public DateResult<User> queryUser(@RequestParam Integer id) {         User user = new User();         user.setId(10);         user.setName("张三");         user.setEmil("1234456@qq.com");         user.setAddress("测试地址");         DateResult<User> dateResult = new DateResult<User>();         dateResult.setCode(ResultCode.SUCCESS.code());         dateResult.setMsg("查询成功");         dateResult.setResult(user);         return dateResult;     } }

实体类User代码如下:

package com.example.demo.entity;  import java.io.Serializable;  import com.alibaba.fastjson.JSON;  public class User implements Serializable {     private Integer id;     private String  name;     private String  emil;     private String  phone;     private String  address;      public Integer getId() {         return id;     }      public void setId(Integer id) {         this.id = id;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public String getEmil() {         return emil;     }      public void setEmil(String emil) {         this.emil = emil;     }      public String getPhone() {         return phone;     }      public void setPhone(String phone) {         this.phone = phone;     }      public String getAddress() {         return address;     }      public void setAddress(String address) {         this.address = address;     }      @Override     public String toString() {         return JSON.toJSONString(this);     } }

先测试没有数据的返回格式,测试结果如下:

无数据的返回格式

测试有返回数据的格式,测试结果如下:

如上的返回结果,我们需要在controller类中每次都需要new一个返回对象比较麻烦,我们可以新建一个ResultUtil

package com.example.demo.base;  /**  * 响应结果生成工具  */ public class ResultUtil {     private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";      public static Result genSuccessResult() {          Result result = new Result();         result.setCode(ResultCode.SUCCESS.code());         result.setMsg(DEFAULT_SUCCESS_MESSAGE);         return result;     }      public static <T> DateResult<T> genSuccessResult(T data) {         DateResult<T> dateResult = new DateResult<T>();         dateResult.setCode(ResultCode.SUCCESS.code());         dateResult.setMsg(DEFAULT_SUCCESS_MESSAGE);         dateResult.setResult(data);         return dateResult;     }  }

 controller 类的代码修改如下:

package com.example.demo.controller;  import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;  import com.example.demo.base.DateResult; import com.example.demo.base.Result; import com.example.demo.base.ResultUtil; import com.example.demo.entity.User;  @RestController @RequestMapping("/user") public class UserController {     @PostMapping("/update")     public Result updateUser(@RequestParam Integer id) {          return ResultUtil.genSuccessResult();     }      @RequestMapping("/detail")     public DateResult<User> queryUser(@RequestParam Integer id) {         User user = new User();         user.setId(10);         user.setName("张三");         user.setEmil("1234456@qq.com");         user.setAddress("测试地址");         return ResultUtil.genSuccessResult(user);     } }