Spring Cloud Feign Client @RequestParam with List parameter 创建了一个错误的请求
Spring Cloud Feign Client @RequestParam with List parameter creates a wrong request
我有一个 Spring Clound Feign Client 映射定义如下
@RequestMapping(method = RequestMethod.GET, value = "/search/findByIdIn")
Resources<MyClass> get(@RequestParam("ids") List<Long> ids);
当我打电话时
feignClient.get(Arrays.asList(1L,2L,3L))
根据我在调试器中看到的,feign-core 库形成了以下请求:
/search/findByIdIn?ids=1&ids=2&ids=3
而不是预期的
/search/findByIdIn?ids=1,2,3
这对服务器来说是正确的Spring 数据 REST 端点声明方式与我的 Feign 客户端方法相同。
因此,由于这个问题,请求总是 returns 空集。
我见过类似的 ,但看起来 Feign 客户端在 2015 年的时候就像我预期的那样工作。
我正在使用:
- spring-cloud-starter-feign 版本 1.2.4.RELEASE
- feign-httpclient 版本 9.4.0
- feign-core 版本 9.4.0
有没有办法纠正 "marry" 具有 Spring Data REST 定义的端点的 Spring Cloud Feign 客户端?
我遇到了同样的问题,多次出现参数而不是预期的逗号分隔的项目序列。解决方案非常简单:
在我的 feign 客户端中我使用了数组
feignClient.get(new Long[]{1L,2L,3L})
而不是collection/list:
feignClient.get(Arrays.asList(1L,2L,3L))
在 Feign 中,您可以使用以下内容注释您的控制器
@CollectionFormat(feign.CollectionFormat.CSV)
它将处理
中的集合
CSV格式findByIdIn?ids=1&ids=2&ids=3
我今天刚遇到这个问题,对我来说解决方案非常简单。
如果使用方括号 []
表示查询数组:
Resources<MyClass> get(@RequestParam("ids[]") List<Long> ids);
它将创建一个如下所示的请求
/search/findByIdIn?ids[]=1&ids[]=2&ids[]=3
大多数服务器端框架会将其解释为一个数组。
如果你的服务器也在 spring 那么你可以这样选择
@GetMapping("/search/findByIdIn")
public ResponseEntity findByIdIn(@RequestParam("ids[]") List<Long> ids) { ... }
请记住,查询必须被编码,[]
被编码为 %5B%5D
。
感谢 @prola 的回答。
只是为了添加一个明确的例子,@CollectionFormat(feign.CollectionFormat.CSV)
注释针对一个方法;您不能全局应用到您的 Feign Client 界面。
所以每个方法都类似于:
@RequestMapping(value = ["/objects"], method = [RequestMethod.GET])
@CollectionFormat(feign.CollectionFormat.CSV)
fun findById(
@RequestParam(value = "object.id", required = true) id: String,
@RequestParam(value = "object.fields", required = false) objectFields: List<String> = DEFAULT_FIELDS_LIST,
@RequestParam(value = "format") format: String = FORMAT,
): ResponseEntity<ObjectsDTO>
结果会是
/objects?object.fields=size,weight,location
而不是
/objects?object.fields=size&object.fields=weight&object.fields=location
您还可以参考:
我有一个 Spring Clound Feign Client 映射定义如下
@RequestMapping(method = RequestMethod.GET, value = "/search/findByIdIn")
Resources<MyClass> get(@RequestParam("ids") List<Long> ids);
当我打电话时
feignClient.get(Arrays.asList(1L,2L,3L))
根据我在调试器中看到的,feign-core 库形成了以下请求:
/search/findByIdIn?ids=1&ids=2&ids=3
而不是预期的
/search/findByIdIn?ids=1,2,3
这对服务器来说是正确的Spring 数据 REST 端点声明方式与我的 Feign 客户端方法相同。
因此,由于这个问题,请求总是 returns 空集。
我见过类似的
我正在使用:
- spring-cloud-starter-feign 版本 1.2.4.RELEASE
- feign-httpclient 版本 9.4.0
- feign-core 版本 9.4.0
有没有办法纠正 "marry" 具有 Spring Data REST 定义的端点的 Spring Cloud Feign 客户端?
我遇到了同样的问题,多次出现参数而不是预期的逗号分隔的项目序列。解决方案非常简单:
在我的 feign 客户端中我使用了数组
feignClient.get(new Long[]{1L,2L,3L})
而不是collection/list:
feignClient.get(Arrays.asList(1L,2L,3L))
在 Feign 中,您可以使用以下内容注释您的控制器
@CollectionFormat(feign.CollectionFormat.CSV)
它将处理
CSV格式findByIdIn?ids=1&ids=2&ids=3
我今天刚遇到这个问题,对我来说解决方案非常简单。
如果使用方括号 []
表示查询数组:
Resources<MyClass> get(@RequestParam("ids[]") List<Long> ids);
它将创建一个如下所示的请求
/search/findByIdIn?ids[]=1&ids[]=2&ids[]=3
大多数服务器端框架会将其解释为一个数组。 如果你的服务器也在 spring 那么你可以这样选择
@GetMapping("/search/findByIdIn")
public ResponseEntity findByIdIn(@RequestParam("ids[]") List<Long> ids) { ... }
请记住,查询必须被编码,[]
被编码为 %5B%5D
。
感谢 @prola 的回答。
只是为了添加一个明确的例子,@CollectionFormat(feign.CollectionFormat.CSV)
注释针对一个方法;您不能全局应用到您的 Feign Client 界面。
所以每个方法都类似于:
@RequestMapping(value = ["/objects"], method = [RequestMethod.GET])
@CollectionFormat(feign.CollectionFormat.CSV)
fun findById(
@RequestParam(value = "object.id", required = true) id: String,
@RequestParam(value = "object.fields", required = false) objectFields: List<String> = DEFAULT_FIELDS_LIST,
@RequestParam(value = "format") format: String = FORMAT,
): ResponseEntity<ObjectsDTO>
结果会是
/objects?object.fields=size,weight,location
而不是
/objects?object.fields=size&object.fields=weight&object.fields=location
您还可以参考: