时间:2021-05-02
本节我们来探讨如何使用Feign构造多参数的请求。笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE、PUT等)的请求原理相通,读者可自行研究。
GET请求多参数的URL
假设我们请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三 ,要如何构造呢?
我们知道,Spring Cloud为Feign添加了Spring MVC的注解支持,那么我们不妨按照Spring MVC的写法尝试一下:
? 1 2 3 4 5 @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) 方法一
? 1 2 3 4 5 @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接口的编写。
? 1 2 3 4 5 @FeignClient(name = "microservice-provider-user") public interface UserFeignClient { @RequestMapping(value = "/get", method = RequestMethod.GET) public User get2(@RequestParam Map<String, Object> map); }在调用时,可使用类似以下的代码。
? 1 2 3 4 5 6 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是这样编写的:
? 1 2 3 4 5 6 7 @RestController public class UserController { @PostMapping("/post") public User post(@RequestBody User user) { ... } }我们要如何使用Feign去请求呢?答案非常简单,示例:
? 1 2 3 4 5 @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
(2) 建议使用Feign原生的注解的Issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/659
(3) 建议增强Feign的功能:https://github.com/spring-cloud/spring-cloud-netflix/issues/1360
(4) 建议支持可选的Request Body(目前Feign当POST一个null时,会报异常):https://github.com/spring-cloud/spring-cloud-netflix/issues/1047
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.itmuch.com/spring-cloud-sum/feign-multiple-params/
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Spring-cloud-eureka使用feign调用服务接口的具体方法,供大家参考,具体内容如下基于spring-boot2.0以上版本完成的微服务架构po
在Spring-Cloud-Gateway之请求处理流程文中我们了解最终网关是将请求交给过滤器链表进行处理,接下来我们阅读Spring-Cloud-Gatewa
1.官方文档https://cloud.spring.io/spring-cloud-static/spring-cloud-openfeign/2.2.2.R
spring接收请求参数:1,使用HttpServletRequest获取@RequestMapping("/login.do")publicStringlog
文档地址https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-ali