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

网友投稿 486 2023-02-10


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

本节我们来探讨如何使用Feign构造多参数的请求。笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE、PUT等)的请求原理相通,读者可自行研究。

GET请求多参数的URL

假设我们请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三 ,要如何构造呢?

我们知道,Spring Cloud为Feign添加了Spring MVC的注解支持,那么我们不妨按照SprbtMnLPGnIKing 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.http://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 map);

}

在调用时,可使用类似以下的代码。

public User get(String username, String password) {

HashMap map = Maps.newHashMap();

map.put("id", "1");

map.put("username", "张三");

return this.userFeignClient.get2(map);

}

POST请求包含多个参数

下面我们来btMnLPGnIK讨论如何使用Feign构造包含多个参数的POST请求。假设服务提供者的Controller是这样编写的:

@RestController

public class UserController {

@PostMapping("/post")

public User post(@RequestBody User user) {

...

}

}

我们要如何使用Feign去请求呢?答案非常简单,示例:

@FeignClient(name = "microservice-provider-user")

public intbtMnLPGnIKerface 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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自动化接口测试(自动化接口测试框架搭建)
下一篇:自动测试及接口技术(自动测试及接口技术有哪些)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~