Loading... # **如何使用Feign构造多参数的请求** > **TIPS** > > **本文基于Spring Cloud Greenwich SR1,理论上支持Finchley及更高版本。** **本节来探讨如何使用Feign构造多参数的请求。笔者以GET及POST请求为例讲解,其他方式(例如DELETE、PUT等)的请求原理相通,读者可自行研究。** ## GET请求多参数的URL **假设需请求的URL包含多个参数,例如**`http://microservice-provider-user/get?id=1&username=张三` ,该如何使用Feign构造呢? **我们知道,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方法发送请求。于是导致了异常。正确写法如下** ### 方法一[推荐] ``` @FeignClient("microservice-provider-user") public interface UserFeignClient { @GetMapping("/get") public User get0(@SpringQueryMap User user); } ``` ### 方法二[推荐] ``` @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注解指定请求的参数是什么。** ### 方法三[不推荐] **多参数的URL也可使用Map来构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。** ``` @FeignClient(name = "microservice-provider-user") public interface UserFeignClient { @RequestMapping(value = "/get", method = RequestMethod.GET) public User get2(@RequestParam Map<String, Object> map); } ``` **在调用时,可使用类似以下的代码。** ``` public User get(String username, String password) { HashMap<String, Object> map = Maps.newHashMap(); map.put("id", "1"); map.put("username", "张三"); return this.userFeignClient.get2(map); } ``` **注意**:这种方式不建议使用。主要是因为可读性不好,而且如果参数为空的时候会有一些问题,例如`map.put("username", null);` 会导致`microservice-provider-user` 服务接收到的username是`""` ,而不是null。 ## 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); } ``` ## 配套代码 * [https://github.com/itmuch/spring-cloud-docker-microservice-book-code/tree/master/microservice-provider-user-multiple-params](https://github.com/itmuch/spring-cloud-docker-microservice-book-code/tree/master/microservice-provider-user-multiple-params) * [https://github.com/itmuch/spring-cloud-docker-microservice-book-code/tree/master/microservice-consumer-movie-feign-multiple-params](https://github.com/itmuch/spring-cloud-docker-microservice-book-code/tree/master/microservice-consumer-movie-feign-multiple-params) 最后修改:2022 年 10 月 18 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请点个赞吧~