#1 问题描述
在基于Spring Boot的项目中实现了请求转发(使用 RestTemplate 的 exchange 方法)的功能,忽然在前端报net::ERR_CONTENT_DECODING_FAILED 200 (OK)的错误,后端及上游系统日志均显示请求已完成。
#2 原因探寻
上述错误字面意思为内容解码失败,就是说浏览器拿到后端数据后没办法正常解码。此时我们看看请求响应的编码

可以看到上游系统启用了响应压缩,然后中转系统读取方式为:
restTemplate.exchange(entity, String::class.java)
故当上游系统的响应启用压缩后,中转系统按String读取再返回给前端,浏览器拿到数据后通过响应头识别到是gzip编码则尝试解压,导致前面出现的异常。
#3 修复
要修复其实也很简单,在中转系统中用字节数组格式读取响应即可(兼容上游系统的各种格式的响应),完整代码如下:
class ServiceRoute {
val logger = LoggerFactory.getLogger(javaClass)
val restTemplate = RestTemplate().also {
}
fun redirect(request:HttpServletRequest, response<

本文讲述了在SpringBoot项目中,由于上游系统启用响应压缩,使用RestTemplate的exchange方法进行请求转发时遇到的net::ERR_CONTENT_DECODING_FAILED错误。解决方法是中转系统以字节数组形式读取响应,避免浏览器尝试解压缩。

2727

被折叠的 条评论
为什么被折叠?



