feign.FeignException: status 400 reading
HTTP状态码:400
状态码400的主要定义:
客户端错误,请求包含语法错误或无法完成请求
解释:
告诉客户端它发送了一条异常请求。400页面是当用户在打开网页时,返回给用户界面带有400提示符的页面。其含义是你访问的页面域名不存在或者请求错误。
主要分为两种:
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
400的主要有两种形式:
1、bad request意思是“错误的请求";
2、invalid hostname意思是"不存在的域名”。
Feign 返回400 的主要原因有以下四点(请先定位自己是什么错误再参考):
1、Content-Length 多服务调用导致请求头长度不一致
**解决办法:
使用GET方式请求,将参数挂在URL下面提交就会解决问题**
2、未指定请求格式 导致服务端无法识别
**解决办法:
给@RequestMapping()指定请求格式
@RequestMapping(value = "/txt/add", produces ="application/json")**
@ResponseBody
@RequestMapping(value = "/txt/add", method = RequestMethod.POST, produces ="application/json")
public ReturnData add(@RequestBody JSONObjectEx jsont);
/*如果是@RequestBody 的话不必指定请求方式,Spring会强制指定POST,就算你指定了GET也会报错,@RequestParam强制GET,指定POST还是会按GET请求,这个就有点强势了*/
3、请求 body 太大
比如:A服务里面调用B、C服务,从B、C里面查询出来的数据组织到一起然后去请求D服务,D服务端返回400
** 解决方式**
将pom.xml里的feign-client依赖换成feign-httpclient,然后就可以调用第三方服务
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>10.7.4</version>
</dependency>
bootstrap.yml里面,feign配置
feign:
httpclient:
enabled: true
hystrix:
#设置feign开启hystrix(服务保护)
enabled: true
compression:
request:
# 开启数据压缩请求
enabled: true
# 压缩数据类型
mime-types: text/xml, application/xml, application/json
# 数据压缩下限 2048表示传输数据大于2048 才会进行数据压缩(最小压缩值标准)
min-request-size: 2048
# 开启数据压缩响应
response:
enabled: true
server:
compression:
enabled: true
mime-types: text/xml, application/xml, application/json