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)

大家都在看

  • java使用POI操作XWPFDocument中的XWPFRun(文本)对象的属性详解

    我用的是office word 2016版 XWPFRun是XWPFDocument中的一段文本对象(就是一段文字) 创建文档对象 XWPFDocument docxDocumen…

    Java 2023年6月7日
    091
  • MSSQL中游标的语法结构

    | 0.21分钟 | 342.4字符 | 1、引言&背景 2、开箱即用的游标结构 3、声明与参考资料 | SCscHero | 2022/4/30 PM10:3 | 系列 …

    Java 2023年6月5日
    064
  • 实战派 | Java项目中玩转Redis6.0客户端缓存!

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 哈喽大家好啊,我是Hydra。 在前…

    Java 2023年6月5日
    0103
  • 琐碎的想法(四)键盘布局、快捷键的由来

    写这篇文章的意义 很多不太了解电脑的同学会觉得键盘的快捷键这么多,这么复杂,为什么不设计的简单点,有的键可能一辈子都用不上,这些发明有什么意义? Q & A 问:现在的键盘…

    Java 2023年6月8日
    059
  • 推荐一款颜值逆天且功能齐全的开源Shell工具!

    前言 以前在windows上一直使用的SSH工具是XShell,后来转到mac平台,XShell没有mac版本。所以之前一直在找一款颜值高,功能齐全的可以作为日常使用的Shell工…

    Java 2023年6月8日
    098
  • jemeter使用

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @ 前言 一、jemeter是什么? 二、使用 1.简单测试并发接口 1.1先添加一个线程组如下: 1.2 添加一…

    Java 2023年6月13日
    080
  • 如何利用 RPA 实现自动化获客?

    大家好,我是二哥。前高级技术专家 & 增长黑客,现一枚爱折腾的小小创业者,专注于 RPA & SaaS 软件这块。这次给大家带来如何利用 RPA 实现自动化获客 一…

    Java 2023年6月13日
    089
  • 方法理论学习

    什么是方法 方法在很多地方又称作函数,方法是为完成一个操作而组合在一起的语句组 好处:可以省略编写重复代码;可以组织和简化代码;提高代码的可读性 方法的种类 内置方法 由JDK类库…

    Java 2023年6月6日
    083
  • logback的配置文件加载顺序

    logback的配置文件加载过程还是很简单的,这里做一下简单记录 logback-classic已经包含了 logback-core和 slf4j的依赖,不需要额外引入了 ch.q…

    Java 2023年6月13日
    094
  • SpringBoot注解@NotNull,@NotBlank,@Valid自动判定空值

    搭建springboot项目,我们都是采用的Restful接口,那么问题来了,当前端调用接口或者是其他项目调用时,我们不能单一靠调用方来控制参数的准确性,自己也要对一些非空的值进行…

    Java 2023年6月5日
    081
  • JAVA规则引擎JSR-94笔札

    JSR-94 是由JCP(Java Community Process)组织所制定的java规则引擎API的java请求规范。它主要定义了规则引擎在java运行时的一些API,指导…

    Java 2023年6月15日
    076
  • Hexo 博客安装 Fluid 主题

    一.主题 使用 hexo 推荐选择一款自己喜欢的主题,主题带有一些额外的功能适配,不需要自己去做,比如评论、友链、访问统计。可以浏览官方网站来选择自己喜欢的主题:https://h…

    Java 2023年6月9日
    098
  • 基于TCP/IP协议,定义原始的字节流协议传输Student类

    在分布式系统中,不同节点之间需要进行通信来实现一致性,例如:在投票选举阶段,候选者需要为所有其他节点发送拉票请求,拉票请求中包含着自己的网络地址和任期号,也就是说,我们需要发送一个…

    Java 2023年6月5日
    0143
  • springcloud2.0以上版本_eureka控制台显示_找不到${spring.cloud.client.ipAddress}_没有显示成IP地址

    一般会是 eureka.instance.prefer-ip-address=trueeureka.instance.instance-id={$spring.cloud.clie…

    Java 2023年5月30日
    062
  • AES php java 互转

    php 注意:php 的 mcrypt_簇 在 7.1.0 版本中开始 deprecated,并在 7.2.0 版本中彻底废弃 ,可以增加@来抑制报错 mcrypt always …

    Java 2023年5月29日
    092
  • uni–横向滑动

    html;gutter:true; {{item.name}}</p> <pre><code> ;gutter:true; html;gutte…

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