springboot 定义统一返回结果

tech2023-09-29  92

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

 

最新回复(0)