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

作者:周立 时间:2023-11-03 00:18:31 

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

GET请求多参数的URL

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

我们知道,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: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/

标签:Spring,Cloud,Feign
0
投稿

猜你喜欢

  • SpringMVC实现文件上传和下载功能

    2022-10-03 18:22:27
  • C#中面向对象编程机制之继承学习笔记

    2023-12-12 03:46:43
  • Android跳转三方应用实例代码

    2022-02-01 11:15:42
  • 深入讲解SPI 在 Spring 中的应用

    2022-10-21 03:44:55
  • unity实现贪吃蛇游戏

    2022-05-28 07:07:51
  • java WSDL接口webService实现方式

    2022-06-15 21:03:29
  • Spring及Mybatis整合占位符解析失败问题解决

    2022-08-13 06:42:49
  • 优化常见的java排序算法

    2022-03-25 05:11:54
  • java创建以任意图片为背景的窗口

    2021-11-16 03:08:14
  • Mybatis查询多条记录并返回List集合的方法

    2023-08-08 05:16:48
  • Java构造函数的相互调用代码示例

    2023-07-01 21:42:11
  • Android编程实现的手写板和涂鸦功能

    2022-01-04 19:20:52
  • C#如何快速释放内存的大数组详解

    2021-12-14 18:42:33
  • Android中EditText屏蔽第三方输入法表情的方法示例

    2021-07-23 01:13:11
  • Java 访问剪切板(复制,粘贴)的示例

    2023-11-10 12:26:13
  • 利用Postman和Chrome的开发者功能探究项目(毕业设计项目)

    2021-10-27 10:19:43
  • Android中父View和子view的点击事件处理问题探讨

    2022-06-19 04:26:47
  • C#设计模式之ChainOfResponsibility职责链模式解决真假美猴王问题实例

    2023-04-01 00:39:00
  • 关于C#数强转会不会抛出异常详解

    2021-11-09 05:44:48
  • Android之在linux终端执行shell脚本直接打印当前运行app的日志的实现方法

    2021-06-12 23:41:08
  • asp之家 软件编程 m.aspxhome.com