Spring Boot 3.x Rest API最佳实践:统一响应结构
创作时间:
作者:
@小白创作中心
Spring Boot 3.x Rest API最佳实践:统一响应结构
引用
CSDN
1.
https://blog.csdn.net/felix_alone2012/article/details/141032180
在开发RESTful API时,统一的响应结构可以提高系统的稳定性和可维护性。本文将详细介绍如何在Spring Boot 3.x中实现统一的响应结构,包括定义响应类、实现响应体拦截以及进行API测试。
定义Response
首先,我们需要定义一个通用的响应类Response
,用于封装所有API的响应数据。这个类使用了Lombok注解来简化代码,同时使用Jackson的@JsonInclude
注解来控制JSON序列化时的空值处理。
package com.juan.demo.common.dto;
import ...
@Getter
@Setter
@ToString
public class Response<T> {
/** 响应状态:0-成功 1-失败 */
private Integer status;
/** 实际数据 */
@JsonInclude(JsonInclude.Include.NON_NULL)
private T data;
private static final Integer STATUS_SUCCESS = 0;
public Response() {}
private Response(Integer status, T data) {
this.status = status;
this.data = data;
}
public static <T> Response<T> ok(T data) {
return new Response<>(STATUS_SUCCESS, data);
}
public static <T> Response<T> ok() {
return ok(null);
}
public static void main(String[] args) {
System.out.println(Response.ok());
System.out.println(Response.ok(new ProductResultItemDTO(1L, "spring boot3入门", 30000)));
}
}
这个类主要考察了泛型的使用,通过构造器重载和静态方法重载,提供了灵活的实例化方式。同时,为了防止外部随意创建实例,除了无参构造器外,其他构造器都被设置为私有。如果数据域为null
,则不会参与JSON序列化。
响应体拦截
为了对所有REST控制器的响应结果进行统一处理,我们需要实现ResponseBodyAdvice
接口。这个接口允许我们在响应体写入之前进行拦截和修改。
package com.juan.demo.common.web.support;
import ...
@Slf4j
@RestControllerAdvice
public class RestBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
return Response.ok(body);
}
}
通过@RestControllerAdvice
注解,我们可以确保这个拦截器作用于所有REST控制器。在beforeBodyWrite
方法中,我们使用Response.ok(body)
来包装原始的响应数据。
但是,当API返回值为String
类型时,会遇到类型转换异常。这是因为Web框架在解析方法返回值时已经决定将其作为字符串响应。为了解决这个问题,我们需要在beforeBodyWrite
方法中添加对String
类型的特殊处理:
package com.juan.demo.common.web.support;
import ...
@Slf4j
...
public class RestBodyAdvice implements ResponseBodyAdvice<Object> {
@Resource
private ObjectMapper objectMapper;
...
@SneakyThrows
@Override
public Object beforeBodyWrite(...) {
// 获取api返回值类型
Type type = returnType.getGenericParameterType();
log.info("type = {}", type);
// 如果已经是字符串,则手动json序列化,并将内容类型重置为json格式,默认是普通文本格式
if (type == String.class) {
response.getHeaders().set("Content-Type", MediaType.APPLICATION_JSON_VALUE);
return objectMapper.writeValueAsString(Response.ok(body));
}
...
}
}
通过上述调整,我们可以确保所有API响应都符合统一的JSON结构。
Rest API测试
经过上述配置后,我们可以测试之前的API是否正常工作。从测试结果来看,所有API都返回了统一的JSON结构,如下图所示:
其他API的测试留给读者自行验证。
热门推荐
如何提高项目沟通中的逻辑清晰度
各大快递公司收费、时效与特点大揭秘!全网最全!
下一代防火墙的特点与防火墙类型选择指南
手机无法拨打电话?这份详细排查指南请收好!
最高成交价达4.8万/㎡的文海学区房,究竟该不该买?
如何在银行办理账户的短信通知业务?
德国圣诞树挑选小课堂:助你pick心仪的圣诞树
不锈钢锅和铁锅哪个好?一文详解两者优劣与区别
【饮食科普】耳鸣患者什么能吃,什么能不吃?推荐的饮食清单来了
寻找最佳产地——黄小米哪里最好?(探访黄小米的优质产地和优越条件)
想要瘦,多吃燕麦和大豆!《科学》子刊:高纤维食物扛饿真的很简单
显卡市场现状分析:竞争与机遇并存
氟硅橡胶密封圈:卓越性能在工业应用中的典范
儿童青少年眼轴发育分几个阶段?
第二审程序详解:提升案件审理效率的关键因素
人民币贬值是什么原因造成的:中美贸易战背景下续写
绩效评估与反馈:客观评估,持续改进
结构化面试问题设计的黄金法则:三个维度让招聘准确率提升60%
龙族卡塞尔之门:有梦想的衰小孩路明非详细介绍
张雪峰谈马克思主义理论专业就业前景、考研方向、优势与劣势
粤港澳大湾区:地理位置、城市功能与生活便利
电传输之POE供电的介绍
除非永久戒烟,约半数 18 岁前开始吸烟的年轻男性会死于吸烟
荷兰豆炒制技巧大揭秘,你会吗?
崩坏星穹铁道2.2各主C顶级配队推荐,花停藿强势统治,追击体系迎来完全体阵容!
神经技术及其在各个研究领域的应用:2024 年进展
清朝八旗制度:一种复杂而有效的军事和社会组织形式
河北必吃的6种特色美食推荐,极具冀菜特色,看完流口水了
河北十大名菜:从金毛狮子鱼到李鸿章烩菜,每一道都是历史的味道
电脑C盘空间爆满如何清理?2025新版最有效的清理方法