记一次FEIGN传递头带来的影响

关于HTTP 请求头Accept-Encoding 的理解
Accept-Encoding表示Http响应是否进行压缩,一般的浏览器在访问网页时,是默认在请求头中加入
Accept-Encoding: gzip, deflate ,表示这个请求的内容希望被压缩,压缩的目的是为了减少网络流量,
但是这个只是协议,只能是要求而不是强制的,如果服务器不支持压缩或者没有开启压缩,则不能起到作用,
如果服务器也是支持压缩或者开启压缩,则会在响应头中加入Content-Encoding: gzip 头部,

起因
需要feign调用传递token,于是自定义了RequestInterceptor 进行头信息的传递,

状况
由于项目有配置开启GZIP压缩

server:
  compression:
    enabled: true

在通过feign调用的时候,报如下错误:

Error while extracting response for type [class com.central.common.model.SysAdmin] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens; nested exception is com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens
 at [Source: (PushbackInputStream); line: 1, column: 2]

大致意思是可以看到,feign调用完在json解析的时候报错了.
分析
跟一下feign调用的源码源码
在这里插入图片描述
有两个实现,这里我们看feign.SynchronousMethodHandler#invoke这个方法,SynchronousMethodHandler支持远程调用
在这里插入图片描述
跟进executeAndDecode方法里面
在这里插入图片描述
这里我们直接看response里面的内容,这个时候已经远程调用远成了,看我们的请求头是有带有Accept-Encoding这个头的
Accept-Encoding:[gzip, deflate, br]

在这里插入图片描述
看一下这个两个头的作用,

content-encoding:是指网页使用了哪种压缩方式传输数据给你,
accept-encoding:表示你发送请求时告诉服务器,我可以解压这些格式的数据。
二者的关系是,对方网页会根据你发送的accept-encoding来决定用什么格式(content-encoding)传给你。

原因就明了,我在头信息的传递,把所有的头信息都传递了,告诉服务端我需要压缩,导致feign解析不了

解决办法
方法一: 只传递自己需要的,或者排除accept-encoding这个头

if(name != null && name.equalsIgnoreCase("authorization")) {
    requestTemplate.header(name, values);
}
//if(name != null && !name.equalsIgnoreCase("accept-encoding")) {
//    requestTemplate.header(name, values);
//}

方法二:直接改yml配置,告诉feign我们需要解压

feign:
  compression:
    request:
      enabled: true
      # 配置压缩数据大小的下限
      min-request-size: 8192
    response:
      enabled: true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Feign进行请求时,如果需要传递Map参数,可以通过以下方式解决。首先,在Feign的配置类中注入SpringFormEncoder来支持Map传参时的表单参数编码。具体代码如下: ```java @Configuration public class FeignConfig { @Bean public Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> converters) { return new SpringFormEncoder(new SpringEncoder(converters)); } } ``` 然后,在Feign接口的方法上添加`consumes="application/x-www-form-urlencoded"`注解,并将参数声明为`@RequestBody Map<String, ?>`。示例代码如下: ```java @PostMapping(value = "/feign/sayHelloWithMap", consumes = "application/x-www-form-urlencoded") String sayHelloWithMap(@RequestBody Map<String, ?> map); ``` 这样就可以通过Feign传递Map参数了。\[1\] #### 引用[.reference_title] - *1* [springcloud openfeign通过map传递form表单参数](https://blog.csdn.net/LeoHan163/article/details/127269671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [.form文件_Feign完美解决服务之间传递文件、传递list,map、对象等情况](https://blog.csdn.net/weixin_39982537/article/details/110252979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [springcloud feign 传递map 对象 多媒体文件](https://blog.csdn.net/sswltt/article/details/80415284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值