Spring Boot Feign包含数组的requestParam

时间:2018-05-26 22:05:41

标签: arrays spring spring-boot spring-cloud-feign feign

我试图查询https://transport.opendata.ch/ API。在此API中,可以过滤响应以避免大的有效负载(使用?fields[]=...)。

例如:http://transport.opendata.ch/v1/connections?from=Lausanne&to=Zurich&fields[]=connections/from&fields[]=connections/to

我使用Spring Boot和Feign,这是我的代码:

@FeignClient(value = "transport", url = "${transport.url}")
public interface TransportClient {

    @RequestMapping(method = GET, value = "/connections", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Connections getConnections(@RequestParam("from") String from, @RequestParam("to") String to, @RequestParam("fields[]") String[] fields);

    default Connections getConnections(String from, String to) {
        return getConnections(from, to, new String[] {"connections/from", "connections/to"});
    }
}

问题在于生成的请求:

http://transport.opendata.ch/v1/connections?from=Lausanne&to=Zurich&fields%5B%5D=connections%2Ffrom%2Cconnections%2Fto

正如您所看到的,网址已被编码且数组未正确绑定(使用逗号而不是网址中的多个fields)。

有没有办法实现这个目标?如果用FeignClient(Spring)无法完成,可能有Feign可能吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您的典型请求如下:

 /api?fields=1&fields=2&fields=3

 /api?fields=1,2,3

控制器方法是:

@RequestMapping(method = GET, value = "/api", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
Connections getConnections(@RequestParam("fields") List<String> fields)

答案 1 :(得分:0)

我刚刚找到了解决方案:

@FeignClient(value = "transport", url = "${transport.url}")
public interface TransportClient {

    @RequestMapping(method = GET, value = "/connections?fields[]=connections/from&fields[]=connections/to", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Connections getConnections(@RequestParam("from") String from, @RequestParam("to") String to);
}

我很幸运,因为我的字段是静态的,所以我可以将它们直接放在URI中,但是如何以通用的方式正确处理它?<​​/ p>