如何使用Feign构造多参数的请求
本文时间比较久远,请前往 http://www.itmuch.com/spring-cloud-sum/feign-multiple-params-2 阅读,姿势更全面。
本节来探讨如何使用Feign构造多参数的请求。笔者以GET及POST请求为例讲解,其他方式(例如DELETE、PUT等)的请求原理相通,读者可自行研究。
GET请求多参数的URL
假设需请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三
,该如何使用Feign构造呢?
我们知道,Spring Cloud为Feign添加了Spring MVC的注解支持,那么我们不妨按照Spring MVC的写法尝试一下:
1 |
|
然而,这种写法并不正确,控制台会输出类似如下的异常。
1 | feign.FeignException: status 405 reading UserFeignClient#get0(User); content: |
由异常可知,尽管我们指定了GET方法,Feign依然会使用POST方法发送请求。
正确写法如下
方法一
1 |
|
这是最为直观的方式,URL有几个参数,Feign接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么。
方法二
多参数的URL也可使用Map来构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。
1 |
|
在调用时,可使用类似以下的代码。
1 | public User get(String username, String password) { |
POST请求包含多个参数
下面来讨论如何使用Feign构造包含多个参数的POST请求。假设服务提供者的Controller是这样编写的:
1 |
|
我们要如何使用Feign去请求呢?答案非常简单,示例:
1 |
|
配套代码
- 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
TIPS
- 除本节讲解的方式外,我们也可编写自己的编码器来构造多参数的请求,但这种方式编码成本较高,代码可重用性较低,故此不再赘述。
拓展阅读
- 希望Feign能够支持参数请求使用POJO的Issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/1253
- 建议使用Feign原生的注解的Issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/659
- 建议增强Feign的功能:https://github.com/spring-cloud/spring-cloud-netflix/issues/1360
- 建议支持可选的Request Body(目前Feign当POST一个null时,会报异常):https://github.com/spring-cloud/spring-cloud-netflix/issues/1047
评论系统未开启,无法评论!