請求OpenFeign的GET請求時,請求為何失敗?

進擊の菜鳥發表於2020-10-23

請求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);

}

相關文章