Spring Cloud Feign 遇到的問題總結
阿新 • • 發佈:2018-11-11
GET請求多引數的URL
假設我們請求的URL包含多個引數,例如http://microservice-provider-user/get?id=1&username=張三 ,要怎麼辦呢?
我們知道Spring Cloud為Feign添加了Spring MVC的註解支援,那麼我們不妨按照Spring MVC的寫法嘗試一下:
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/get", method = RequestMethod.GET)
public User get0(User user);
}
然而我們測試時會發現該寫法不正確,我們將會收到類似以下的異常:
feign.FeignException: status 405 reading UserFeignClient#get0(User); content: {"timestamp":1482676142940,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/get"}
由異常可知,儘管指定了GET方法,Feign依然會發送POST請求。
正確寫法如下:
(1) 方法一
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/get", method = RequestMethod.GET)
public User get1(@RequestParam("id") Long id, @RequestParam("username") String username);
}
這是最為直觀的方式,URL有幾個引數,Feign介面中的方法就有幾個引數。使用@RequestParam註解指定請求的引數是什麼。
(2) 方法二
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/get", method = RequestMethod.GET)
public User get2(@RequestParam Map<String, Object> map);
}
多引數的URL也可以使用Map去構建。當目標URL引數非常多的時候,可使用這種方式簡化Feign介面的編寫。
POST請求包含多個引數
下面我們來討論如何使用Feign構造包含多個引數的POST請求。舉個例子,假設我們的使用者微服務的Controller是這樣編寫的:
@RestController
public class UserController {
@PostMapping("/post")
public User post(@RequestBody User user) {
...
}
}
我們的Feign介面要如何編寫呢?答案非常簡單,示例:
@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
@RequestMapping(value = "/post", method = RequestMethod.POST)
public User post(@RequestBody User user);
}