前后端分离项目中后端开发需要写相应的接口,定义统一的返回格式有利于提高开发效率和沟通的成本。通常返回的格式主要如下两种: 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); } }