通过SpringCloud Feign 调用其他项目或微服务的接口方法时报Request method 'POST' not supported 的错误:
问题出现原因:
- 可能的原因是 Feign 默认使用的请求方法为 POST,而不是 GET。
- 另外也有可能是由于消费方法和接口方法使用的注解不正确;如果 Feign 代理的是 get 请求,则每个参数必须带上 @RequestParam 注解,否则会报 POST not supported
- 可能是SpringCloud原生的Feign,可以考虑使用OpenFeign
- 可以考虑修改使用feign默认配置的方法默认使用post
- 通过feign调用get请求时,如果接口参数含有POJO时,可能会出现 'POST' not supported
解决方法
-
在Feign代理接口方法处使用 @RequestMapping 替代 @GetMapping: 尝试使用 @RequestMapping 注解代替 @GetMapping 注解,显式指定请求方法为 GET。示例代码如下:
java@FeignClient(name = "your-service-name") public interface YourFeignClient { @RequestMapping(method = RequestMethod.GET, value = "/your/api/path") String yourGetMethod(); }
-
另外也有可能是由于消费方法和接口方法使用的注解不正确;
@RequestBody-------------> @PostMapping
@RequestParam 、@PathVariable------@GetMapping
java@GetMapping("/user/list") List<userInfo> list(@PathVariable List<String> userIdList);
-
在pom.xml文件引入openfeign
java<!-- 在 pom 中添加依賴--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
-
自定义 FeignClient 的配置: 在 FeignClient 的配置类中,可以自定义 Feign 的配置,指定 FeignClient 默认的请求方法为 GET。示例代码如下:
java@Configuration public class FeignConfiguration { @Bean public RequestInterceptor requestInterceptor() { return new RequestInterceptor() { @Override public void apply(RequestTemplate template) { template.method("GET"); } }; } }
-
还有一种情况,涉及到实体类的情况,如果接口参数含有POJO,feign调用入参是POJO的GET请求时,会往body里设置参数,而因为发现body里有数据,就会自动将get请求转为post,feign版本在2.0以上,在消费方法的实体类对象参数前新增@SpringQueryMap注解即可
java@FeignClient("user") public class userList{ @GetMapping(path="/your/api/path") String queryUser(@SpringQueryMap User user); }