SpringBoot 系列 web 篇之自定义返回 Http Code 的 n 种姿势

虽然 http 的提供了一整套完整、定义明确的状态码,但实际的业务支持中,后端并不总会遵守这套规则,更多的是在返回结果中,加一个 code 字段来自定义业务状态,即便是后端 5xx 了,返回给前端的 http code 依然是 200

那么如果我想遵守 http 的规范,不同的 case 返回不同的 http code 在 Spring 中可以做呢?

本文将介绍四种设置返回的 HTTP CODE 的方式

  • @ResponseStatus 注解方式
  • HttpServletResponse#sendError
  • HttpServletResponse#setStatus
  • ResponseEntity

I. 返回 Http Code 的 n 种姿势

进入正文之前,先创建一个 SpringBoot 项目,本文示例所有版本为 spring-boot.2.1.2.RELEASE

(需要测试的小伙伴,本机创建一个 maven 项目,在 pom.xml文件中,拷贝下面的配置即可)

下面所有的方法都放在 ErrorCodeRest 这个类中

通过注解 @ResponseStatus,来指定返回的 http code, 一般来说,使用它有两种姿势,一个是直接加在方法上,一个是加在异常类上

直接在方法上添加注解,并制定对应的 code

实测一下,返回结果如下

当我们发起请求时,返回的状态码为 400,返回的数据为 springboot 默认的错误信息格式

虽然上面这种使用姿势可以设置 http code,但是这种使用姿势有什么意义呢?

如果看过 web 系列教程中的:SpringBoot 系列教程 web 篇之全局异常处理 可能就会有一些映象,配合 @ExceptionHandler来根据异常返回对应的状态码

一个推荐的使用姿势,下面表示当你的业务逻辑中出现数组越界时,返回 500 的状态码以及完整的堆栈信息

另外一种使用姿势就是直接装饰在异常类上,然后当你的业务代码中,抛出特定的异常类,返回的 httpcode 就会设置为注解中的值

测试结果如下,在异常类上添加注解的方式,优点在于不需要配合 @ExceptionHandler写额外的逻辑了;缺点则在于需要定义很多的自定义异常类型

  • ResponseStatus 注解的使用姿势,只支持标准的 Http Code(必须是枚举类 org.springframework.http.HttpStatus

这种使用姿势就比较简单了,方法的返回结果必须是 ResponseEntity,下面给出两个实际的 case

实测结果

从上面的使用实例上看,可以知道这种使用方式,不仅仅支持标准的 http code,也支持自定义的 code(如返回 code 451)

这种使用姿势则是直接操作 HttpServletResponse对象,手动录入返回的结果

输出结果

使用方式比较简单,直接设置 status 即可,支持自定义的 Http Code 返回

使用这种姿势的时候需要注意一下,只支持标准的 http code,而且 response body 中不会有你的业务返回数据,如

输出结果

从上面的 case 也可以看出,当我们使用 send error 时,如果是标准的 http code,会设置对响应头;如果是自定义的不被识别的 code,那么返回的 http code 是 500

上面介绍了几种常见的设置响应 http code 的姿势,下面小结一下使用时的注意事项

  • 只支持标准的 http code
  • 装饰自定义异常类,使用时抛出对应的异常类,从而达到设置响应 code 的效果

  • 缺点对非可控的异常类不可用

  • 结合 @ExceptionHandler,用来装饰方法

形如:

  • 我个人感觉是最强大的使用姿势,就是写起来没有那么简洁
  • 支持自定义 code,支持设置 response body

  • setStatus: 设置响应 code,支持自定义 code,支持返回 response body

  • sendError: 只支持标准的 http code,如果传入自定义的 code,返回的 http code 会是 500

转自:https://developer.aliyun.com/article/925496

Original: https://www.cnblogs.com/fnlingnzb-learner/p/16382493.html
Author: Boblim
Title: SpringBoot 系列 web 篇之自定义返回 Http Code 的 n 种姿势

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540967/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球