欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Cloud如何使用Feign构造多参数的请求

程序员文章站 2022-10-10 16:18:18
本节我们来探讨如何使用feign构造多参数的请求。笔者以get以及post方法的请求为例进行讲解,其他方法(例如delete、put等)的请求原理相通,读者可自行研究。...

本节我们来探讨如何使用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时,会报异常):

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。