spring-boot中統(tǒng)一修改http響應(yīng)體內(nèi)容的方法
在spring-boot開發(fā)中,有時(shí)候會(huì)遇到一些統(tǒng)一修改http接口響應(yīng)體內(nèi)容的場(chǎng)景,比如統(tǒng)一增加一些響應(yīng)頭信息、統(tǒng)一增加一些數(shù)據(jù)包裝處理、數(shù)據(jù)轉(zhuǎn)換等場(chǎng)景,spring框架中已經(jīng)為我們提供了這種能力,即ResponseBodyAdvice切面的使用,ResponseBodyAdvice就是spring框架中預(yù)留的鉤子,它作用在Controller方法執(zhí)行完成之后,http響應(yīng)體寫回客戶端之前,這個(gè)時(shí)候我們就能方便的織入一些自己的業(yè)務(wù)邏輯處理了
工作原理
查看ResponseBodyAdvice接口的源碼中,提供了兩個(gè)方法
supports方法用于判斷beforeBodyWrite方法的執(zhí)行與否,返回值為布爾類型,返回true即執(zhí)行beforeBodyWrite方法;可以在實(shí)現(xiàn)類中編寫實(shí)現(xiàn)邏輯,來(lái)根據(jù)MethodParameter以及HttpMessageConverter類型判斷是否需要改寫http響應(yīng)體
beforeBodyWrite方法提供了用于修改http響應(yīng)體的能力,我們要編寫的核心邏輯就是這個(gè)方法所在了,該方法中提供了Controller方法的返回值,ServerHttpRequest 、ServerHttpResponse 對(duì)象等,在實(shí)現(xiàn)類方法中,我們拿到這些對(duì)象,根據(jù)需要來(lái)編寫修改邏輯
使用方式
自定義一個(gè)實(shí)現(xiàn)ResponseBodyAdvice接口的實(shí)現(xiàn)類,添加注解@ControllerAdvice,來(lái)攔截Controller控制器的執(zhí)行
示例代碼:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/CustomResponseBodyAdvice.java
2. 建立測(cè)試用的控制器UserAgentController,用于返回User-Agent頭信息
示例代碼:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/UserAgentController.java
3. 建立測(cè)試用于返回Map類型數(shù)據(jù)的映射方法
完整示例代碼:https://github.com/netbuffer/spring-boot-demo/blob/master/src/main/java/cn/netbuffer/springboot/demo/controller/BeanController.java
運(yùn)行效果
使用Postman工具訪問/ua接口測(cè)試
可以看到返回的數(shù)據(jù)中已經(jīng)被[]包裝了

再查看返回的http響應(yīng)頭中,能看到我們添加的x-abc響應(yīng)頭

再訪問map接口查看結(jié)果,可以看到有多余的extData字段被添加進(jìn)去了

完整測(cè)試工程參考:https://github.com/netbuffer/spring-boot-demo