1. 程式人生 > >Spring Cloud Feign 遇到的問題總結

Spring Cloud Feign 遇到的問題總結

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);
}