请求OpenFeign的GET请求时,请求为何失败?
在OPENFEGIN的接口中定义了一个GET请求方式的方法,且方法中带有入参,入参并没有任何添加任何注解,如下所示:
@FeignClient(name = "myfegin", path = "/api/test")
public interface MyFeignClient {
@GetMapping(path = "/getMessage")
JsonResult<String> getVideoDuration(String id);
}
当我们通过另一个微服务中的接口通过 OpenFeign 的客户端调用该接口时,提示接口调用失败,自然也就没有任何返回。
通过在Feign所在的客户端断点,发现如下提示:
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:213)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:422)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:110)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:59)
// 省略错误信息
看到上述报错信息时,也是百思不得其解,Request method 'POST' not supported
不支持 POST 请求,但是我们所发送的是 GET 请求,由此我们借用断点调试发现,当我们发送的 GET 请求到了 OpenFeign 服务端后,服务端检测到该请求携带一个入参,并且入参没有做任何注解修饰,因此默认将该请求当做 POST 请求处理,而服务端对应该路径的请求只有 GET ,所以报错。
解决方案:
在 FeignClient 客户端的 GET 请求中的入参前面加入注解修饰:@requestParam 即可解决该问题
@FeignClient(name = "myfegin", path = "/api/test")
public interface MyFeignClient {
@GetMapping(path = "/getMessage")
JsonResult<String> getVideoDuration(@RequestParam("id") String id);
}