错误信息展示:

ios 请求接口报错405 请求接口报400_feign


这是kibana上的日志输出,报错400 bad request!

背景

feign版本3.0.0
分布式项目
测试环境运行
服务内部通过POST请求进行交互报错400

断言

初步断言可能存在的情况:
1、调用者与被调用者的feign请求方式不统一
2、调用者与被调用者的参数不匹配

解决过程

根据断言排查

根据断言排查发现,全部无误:
调用者使用POST方式请求,被调用者使用POST方式提供接口
入参类型及名称均一致
被调用者使用@RequestParam(“xxx”)的方式接收多个参数

配置信息排查

根据断言未发现问题,猜测是否配置信息异常?
检查yml文件如下:

# feign 配置
feign:
  sentinel:
    enabled: true
  okhttp:
    enabled: true
  httpclient:
    enabled: false
  client:
    config:
      default:
        connectTimeout: 10000
        readTimeout: 10000
  compression:
    request:
      enabled: true
    response:
      enabled: true

未发现异常,所有配置不影响实际调用的情况

git分支或者maven私服版本排查

多分支排查后发现分支发版没有问题
调用者以来的被调用者发布的maven私服版本一致

切换环境尝试

调用者与被调用者均切换到本地环境进行联调测试
排除因环境不同造成的问题

面向百度编程,百度搜索经验

百度此类问题发现有以下几种情况:
1、请求参数过长,超出URL长度最大长度(4k)
2、请求头大小进行限制,请求头过大导致
3、使用tomcat/jetty服务器,配置server的max-http-form-post-size,超出size导致


本人的情况均不符合以上三种情况

对比网上规范实例代码

经过百度,发现网上写的feign规范的方式与项目中的不一致。
参考地址:点击这里 网上在使用POST请求多参数的情况下,被调用者使用的@RequestBody注解进行接收参数,而项目中使用的是@RequestParam(“xxx”)的方式接收多个参数。
@RequestParam(“xxx”)的方式接收参数的多为GET方式请求。
所以大胆的猜测是否因为不规范导致的。
修改接口为GET方式进行尝试,结果成功,不再报错400.

总结

Feign报错400存在以下几种情况:
1、编写请求方式不规范
2、请求方式不匹配
3、请求参数不匹配
4、请求参数长度过大
5、服务器要求的请求参数受限
6、请求头长度受限
7、部分配置信息影响
8、运行环境异常
根据以上8中情况进行逐个排查问题,基本能够解决90%的情况。

Feign正确的编写方式

interface 规范

添加 @FeignClient(“xxx-xx-xx”)

@FeignClient("myservice-provider-test")
public interface TestFeignClient {
 
}

GET请求

@FeignClient("myservice-provider-test")
public interface TestFeignClient {
  @RequestMapping(value = "/get", method = RequestMethod.GET)
  Test getTest(@RequestParam("id") Long id, @RequestParam("name") String name);
}

POST请求

@FeignClient("myservice-provider-test")
public interface TestFeignClient {
  @RequestMapping(value = "/post", method = RequestMethod.POST)
  Test post(@RequestBody Test test);
}