Spring Cloud如何使用Feign构造多参数的请求
本节我们来探讨如何使用Feign构造多参数的请求。笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE、PUT等)的请求原理相通,读者可自行研究。 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); } 然而,这种写法并不正确,控制台会输出类似如下的异常。
由异常可知,尽管我们指定了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) 方法二 多参数的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); } 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); } TIPS (1) 本节相关代码,详见本书配套代码中的microservice-provider-user-multiple-params项目和microservice-consumer-movie-feign-multiple-params项目。 (2) 除本节讲解的方式外,我们也可编写自己的编码器来构造多参数的请求,但这种方式编码成本较高,代码可重用性较低。故此,本书不再赘述。 拓展阅读 (1) 希望Feign能够支持参数请求使用POJO的Issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/1253 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |