如何使用Feign构造多参数的请求
如何 参数 请求 构造 Feign 使用
2023-09-14 09:14:19 时间
TIPS
本文基于Spring Cloud Greenwich SR1,理论上支持Finchley及更高版本。
本节来探讨如何使用Feign构造多参数的请求。笔者以GET及POST请求为例讲解,其他方式(例如DELETE、PUT等)的请求原理相通,读者可自行研究。
GET请求多参数的URL
假设需请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三
,该如何使用Feign构造呢?
我们知道,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方法发送请求。于是导致了异常。正确写法如下
方法一[推荐]
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
@GetMapping("/get")
public User get0(@SpringQueryMap User user);
}
方法二[推荐]
@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注解指定请求的参数是什么。
方法三[不推荐]
多参数的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);
}
注意:这种方式不建议使用。主要是因为可读性不好,而且如果参数为空的时候会有一些问题,例如map.put("username", null);
会导致microservice-provider-user
服务接收到的username是""
,而不是null。
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);
}
相关文章
- 教你如何检查一个函数是否为JavaScript运行时环境内建函数
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在初始化的时候写入参数
- Office EXCEL 中如何让一个单元格的数据链接到另一个工作表的数据
- /etc/fstab 参数详解及如何设置开机自动挂载
- 通过NSTimer看IPhone对@selector的函数如何传参数
- Android应用开发(三):如何完成Activity之间的传递参数
- 我是如何让1000个业务成功转型为数据运营的
- Rscripts的使用,以及如何为R脚本传参数
- 如何用SPSS做联合分析
- SAP UI5 应用开发教程之八十四 - 如何指定 SAP UI5 应用程序基于某个特定的版本运行试读版
- 如何分析SAP UI5应用的undefined is not a function错误
- 如何使用SAP UI5 Web Component for React的padding功能
- 如何使用参数调用SAP UI5的bingAggregation
- 如何将 bapi_xbp_job_spoollist_read_20 的 TABLES 参数 SPOOL_LIST 本地导出成 Excel
- 如何使用Marketing Cloud的扩展字段作为搜索条件进行搜索
- Angular 自定义结构化指令,如何传入多个输入参数
- 学习SpringMVC——如何获取请求参数
- 如何重装系统
- 如何开启服务
- 机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size
- Pytest----通过fixture实现参数化时如何对指定某个参数使用skip标记
- Pytest----如何通过usefixtures为一个测试类调用fixture
- 功率电感的各参数:两个额定电流Isat , Irms 如何理解?
- 从0搭建Vue3组件库(四): 如何开发一个组件
- 【Docker系列】4.docker-compose文件如何传递参数