美文网首页
spring-boot中统一修改http响应体内容的方法

spring-boot中统一修改http响应体内容的方法

作者: 向上生长之路 | 来源:发表于2021-09-25 22:43 被阅读0次

在spring-boot开发中,有时候会遇到一些统一修改http接口响应体内容的场景,比如统一增加一些响应头信息、统一增加一些数据包装处理、数据转换等场景,spring框架中已经为我们提供了这种能力,即ResponseBodyAdvice切面的使用,ResponseBodyAdvice就是spring框架中预留的钩子,它作用在Controller方法执行完成之后,http响应体写回客户端之前,这个时候我们就能方便的织入一些自己的业务逻辑处理了

工作原理

查看ResponseBodyAdvice接口的源码中,提供了两个方法

  • supports方法用于判断beforeBodyWrite方法的执行与否,返回值为布尔类型,返回true即执行beforeBodyWrite方法;可以在实现类中编写实现逻辑,来根据MethodParameter以及HttpMessageConverter类型判断是否需要改写http响应体
  • beforeBodyWrite方法提供了用于修改http响应体的能力,我们要编写的核心逻辑就是这个方法所在了,该方法中提供了Controller方法的返回值,ServerHttpRequest 、ServerHttpResponse 对象等,在实现类方法中,我们拿到这些对象,根据需要来编写修改逻辑
public interface ResponseBodyAdvice<T> {
    boolean supports(MethodParameter var1, Class<? extends HttpMessageConverter<?>> var2);

    @Nullable
    T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class<? extends HttpMessageConverter<?>> var4, ServerHttpRequest var5, ServerHttpResponse var6);
}

使用方式

  1. 自定义一个实现ResponseBodyAdvice接口的实现类,添加注解@ControllerAdvice,来拦截Controller控制器的执行

示例代码:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/CustomResponseBodyAdvice.java

@Slf4j
@ControllerAdvice
public class CustomResponseBodyAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        //根据需要来判断是否允许执行beforeBodyWrite
        Class targetClass = methodParameter.getMethod().getDeclaringClass();
        log.debug("supports execute methodParameter={} targetClass={} class={}", methodParameter, targetClass, aClass);
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object data, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        //data即为Controller方法执行后写回的值
        log.debug("beforeBodyWrite data={}", data);
        //这里可以拿到request信息来做特定的逻辑处理
        if (serverHttpRequest.getURI().getPath().equals("/ua")) {
            //测试添加http响应头
            serverHttpResponse.getHeaders().set("x-abc", "header-value");
        }
        //测试根据不同数据类型,来做不同的包装处理、转换等操作
        if (data instanceof String) {
            return "[" + data + "]";
        } else if (data instanceof Map) {
            ((Map) data).put("extData", "value");
            return data;
        } else {
            return data;
        }
    }

}
  1. 建立测试用的控制器UserAgentController,用于返回User-Agent头信息
    示例代码:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/UserAgentController.java
@RestController
@RequestMapping("/ua")
public class UserAgentController {

    @GetMapping
    public String ua(@RequestHeader("User-Agent") String userAgent) {
        return userAgent;
    }
}
  1. 建立测试用于返回Map类型数据的映射方法
    完整示例代码:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/BeanController.java
    @GetMapping(value = {"map"})
    public Map getMap() {
        Map data = new HashMap();
        data.put("name", "test");
        data.put("age", "30");
        return data;
    }

运行效果

使用Postman工具访问/ua接口测试
可以看到返回的数据中已经被[]包装了


再查看返回的http响应头中,能看到我们添加的x-abc响应头

再访问map接口查看结果,可以看到有多余的extData字段被添加进去了

完整测试工程参考:https://github.com/netbuffer/spring-boot-demo

相关文章

  • spring-boot中统一修改http响应体内容的方法

    在spring-boot开发中,有时候会遇到一些统一修改http接口响应体内容的场景,比如统一增加一些响应头信息、...

  • JavaEE中统一修改http响应体内容的方法

    在之前的文章中介绍过Spring Boot开发中统一修改http响应体内容的方法,今天给大家再介绍另一种方案也能实...

  • HTTP协议入门教程,一文就够了!

    1,摘要 本文讲解了HTTP协议的定义,请求/响应的消息体结构定义,HTTP状态码等内容。 2,HTTP协议介绍 ...

  • 网络教程

    http协议包括 请求协议:请求行、请求头、请求体 响应协议:响应行、响应头、响应体 servlet

  • Web API02-HTTP协议基础

    本篇文章主要就“常用的HTTP协议基础”进行展开讲解,包括HTTP请求内容和请求方法,HTTP响应内容和状态码等。...

  • HTTP协议笔记

    请求行GET /POST /ETC 请求头 请求方法 请求体 响应 状态行 HTTP/1.1 200 OK 状...

  • HTTP请求行、请求头、请求体详解

    HTTP请求行、请求头、请求体详解 HTTP响应头和请求头信息对照表 HTTP请求方法对照表 HTTP状态码对照表...

  • HTTP协议

    HTTP请求 包含如下内容请求行请求头空行消息体 HTTP请求方法 请求的方法很多,常用的包含如下: HTTP请求...

  • spring-boot启动图标更改

    spring-boot启动原图 修改后图标 修改方法 在resources路径下新建banner.txt文件。 注...

  • 关于http请求的一些问题

    http传输数据的几种方式 http的数据结构:请求时:url,请求头,包体响应时:状态消息,响应头,包体head...

网友评论

      本文标题:spring-boot中统一修改http响应体内容的方法

      本文链接:https://www.haomeiwen.com/subject/zsiwgltx.html