当前位置:   article > 正文

SpringBoot Web开发响应体响应数据并统一接口返回格式_springboot返回标准响应码

springboot返回标准响应码

前言

本篇文章主要介绍 SpringBoot进行前后端开发时,如何返回json 格式数据以及统一接口的返回格式 。希望观众老爷们多多支持,请在评论区批评指正!

无论是 RestFul风格还是之前 web阶段接触过的异步请求,都需要把数据转换成 json放入到响应体中。

1. 数据放到响应体

我们的 SpringMVC为我们提供了 @ResponseBody注解,@ResponseBody注解标注在类或者方法上:标志在类上,则这个类中的所有请求方法返回的数据都为被 SpringMVC封装为 json格式的数据放到响应体中;标注在方法上,那么该方法返回的数据会被封装为 json格式的数据放到响应体中。

当然如果想要将 Controller层请求方法,默认返回数据都封装 json格式,放到响应体中。那么我们可以使用 @RestController注解,这个注解是 @Controller@ResponseBody注解的结合体,具有相同的作用,该注解只能标志在类上。

2. 数据如何转换为 json

前面的文章提到过,在我们使用 SSM 进行开发的时候,如果想要 SpringMVC帮我们把 json数据转换成我们需要的类型。这时候我们需要进行一些基本配置。SpringMVC默认使用 jackson来进行 json的解析,那么我们就需要导入 jackson的依赖。并且开启注解驱动。

但是我们使用 SpringBoot进行开发时,当我们引入 spring-boot-starter-web场景启动器后,该场景中就包含了 jackson依赖,不需要再额外导入,并且默认开启了注解扫描驱动。

所以说当我们的 Controller层的请求方法,需要将数据放到响应体中进行返回,只需要将数据作为方法的返回值进行返回即可,SpringMVC会自动将数据封装为 json格式放到响应体中。前提是类上或具体的请求方法上标志了 @ResponseBody注解及其相关注解 @RestController

  1. @Controller
  2. @RequestMapping("/user/")
  3. public class HelloController {
  4. @RequestMapping(value="/hi"})
  5. @ResponseBody
  6. public List<String> hello(){
  7. List<String> list = new ArrayList<>();
  8. list.add("hi");
  9. return list;
  10. }
  11. }
  12. 复制代码

3. 封装统一的接口响应格式

在我们进行前后端分离项目开发的时候,后端服务提供 API,前端发送 http请求,来进行数据交互的。

前面的我们进行返回数据的时候,我们是随意返回的,没有状态码和提示,不利于前后端接口的对接。

那么我们可以创建一个类:用于对返回的数据封装为统一的响应格式。

  1. /**
  2. * @param <T> T 返回的数据类型泛型
  3. * @JsonInclude(JsonInclude.Include.NON_NULL) 对象返回的字段中为null(空)的字段不进行序列化,也就是不会显示到响应体中
  4. */
  5. @JsonInclude(JsonInclude.Include.NON_NULL)
  6. public class ResponseResult<T> {
  7. /**
  8. * 状态码
  9. */
  10. private Integer code;
  11. /**
  12. * 提示信息,如果有错误时,前端可以获取该字段进行提示
  13. */
  14. private String msg;
  15. /**
  16. * 返回的结果数据
  17. */
  18. private T data;
  19. private ResponseResult() {
  20. }
  21. public ResponseResult(Integer code, String msg) {
  22. this.code = code;
  23. this.msg = msg;
  24. }
  25. public ResponseResult(Integer code, String msg, T data) {
  26. this.code = code;
  27. this.msg = msg;
  28. this.data = data;
  29. }
  30. public Integer getCode() {
  31. return code;
  32. }
  33. public void setCode(Integer code) {
  34. this.code = code;
  35. }
  36. public String getMsg() {
  37. return msg;
  38. }
  39. public void setMsg(String msg) {
  40. this.msg = msg;
  41. }
  42. public T getData() {
  43. return data;
  44. }
  45. public void setData(T data) {
  46. this.data = data;
  47. }
  48. }
  49. 复制代码

当然我们也可以对常见的状态进行封装,如成功、失败、参数无效、无权限访问等。我们可以创建一个枚举类来完成:

  1. public enum ResultCode {
  2. /**
  3. * 通用状态码
  4. */
  5. SUCCESS(1,"OK"),
  6. FAILED(-1,"FAIL"),
  7. /*
  8. 参数错误状态码
  9. */
  10. PARAM_IS_INVAlID(101,"参数无效"),
  11. PARAM_IS_BLANK(101,"参数为空"),
  12. /* 用户错误 201 - 299 */
  13. USER_NOT_LOGIN(201,"未登录"),
  14. USER_NOT_EXIST(202,"用户不存在"),
  15. USER_LOGIN_ERROR(203,"登陆失败,账号或者密码有误"),
  16. NOT_PERMISSION(204,"无权限访问"),
  17. /* 业务错误 301 - 399*/
  18. DATA_NOT_FOUND(301,"没有数据");
  19. //返回状态码
  20. private Integer code;
  21. //返回消息
  22. private String msg;
  23. private ResultCode() {
  24. }
  25. ResultCode(Integer code, String msg) {
  26. this.code = code;
  27. this.msg = msg;
  28. }
  29. public Integer getCode() {
  30. return code;
  31. }
  32. public void setCode(Integer code) {
  33. this.code = code;
  34. }
  35. public String getMsg() {
  36. return msg;
  37. }
  38. public void setMsg(String msg) {
  39. this.msg = msg;
  40. }
  41. }
  42. 复制代码

这个时候我们需要在 ResponseResult添加新的方法来完成对常见状态枚举类(ResultCode)的对接。

  1. public static <T> ResponseResult<T> setCommonStatusAndData(ResultCode resultCode, T data){
  2. return new ResponseResult<>(resultCode.getCode(), resultCode.getMsg(),data);
  3. }
  4. public static ResponseResult setCommonStatusNoData(ResultCode resultCode){
  5. return new ResponseResult<>(resultCode.getCode(), resultCode.getMsg());
  6. }
  7. 复制代码

下面进行测试:

  1. 使用 ResponseResult类的构造方法返回一个响应格式
  1. @Controller
  2. @RequestMapping("/user/")
  3. public class HelloController {
  4. @GetMapping("/{id}/{username}")
  5. @ResponseBody
  6. public ResponseResult<User> getUserOneInfoByIdAndUsername(@PathVariable("id") Integer id, @PathVariable("username") String username){
  7. User user = new User();
  8. user.setId(id);
  9. user.setName(username);
  10. return new ResponseResult<>(1, "OK", user);
  11. }
  12. }
  13. 复制代码

然后我们使用 apifox进行测试:

  1. 使用枚举类封装的常用状态快速返回
  1. @GetMapping("/{id}/{username}")
  2. @ResponseBody
  3. public ResponseResult<User> getUserOneInfoByIdAndUsername(@PathVariable("id") Integer id, @PathVariable("username") String username){
  4. User user = new User();
  5. user.setId(id);
  6. user.setName(username);
  7. return ResponseResult.setCommonStatusAndData(ResultCode.SUCCESS,user);
  8. }
  9. 复制代码

4. 为什么要统一响应格式

当我们前端发送一个请求,后端服务接口返回数据后,有统一的返回格式 code,msg,data;当前端拿到响应数据后 res.data是返回的响应体,先判断 res.data.code状态码是否成功,如果成功进行一些处理,如果失败,就可以通过 msg来获取提示信息再进行处理。

这样做可以指定统一的接口规范,有利于前后端的交互。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/619877
推荐阅读
相关标签
  

闽ICP备14008679号