Spring Cloud如何使用Feign构造多参数的请求
本节我们来探讨如何使用feign构造多参数的请求。笔者以get以及post方法的请求为例进行讲解,其他方法(例如delete、put等)的请求原理相通,读者可自行研究。
get请求多参数的url
假设我们请求的url包含多个参数,例如=张三 ,要如何构造呢?
我们知道,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) 方法二
多参数的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:
(2) 建议使用feign原生的注解的issue:
(3) 建议增强feign的功能:
(4) 建议支持可选的request body(目前feign当post一个null时,会报异常):
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。