我们通过提供 @CollectionFormat 注解来支持 feign.CollectionFormat。
feign.CollectionFormat 是 Feign 框架中的一个枚举类型。它主要用于定义在将集合类型(如 List、Set等)的参数转换为 HTTP 请求参数时的格式。这对于正确地构建 HTTP 请求,将 Java 中的集合数据发送到远程服务端点是非常重要的。
feign.CollectionFormat 取值如下:
/** * 在 URL 参数中编码集合的各种方法。 * * <p> * 这些特定的情况受到了<a href="http://swagger.io/specification/">OpenAPI 规范</a>的启发。</a>. * </p> */ public enum CollectionFormat { /** 逗号分隔值,例如 foo=bar,baz。 */ CSV(","), /** 空格分隔值,例如 foo=bar baz。 */ SSV(" "), /** 制表符分隔值,例如 foo=bar[制表符]baz。 */ TSV("\t"), /** 用竖线(|)字符分隔的值,例如 foo=bar|baz。 */ PIPES("|"), /** 每个值重复参数名称,例如 foo=bar&foo=baz。 */ // 由于没有单一的分隔符字符,所以将 null 作为特殊情况。 EXPLODED(null); //... }
在下面的例子中,使用 CSV 格式而不是默认的 EXPLODED 来处理这个方法。代码如下:
@FeignClient(value = "SERVICE-DEMO", contextId = "advancedFeign", path = "/simple", configuration = AdvancedFeign.AdvancedFeignConfig.class) public interface AdvancedFeign { // 看这里 @CollectionFormat(feign.CollectionFormat.CSV) @GetMapping(path = "/hello") String demo1(@RequestParam("list") List<String> list); // 自定义配置 @Configuration public static class AdvancedFeignConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } } }
调用接口,代码如下:
@Autowired private AdvancedFeign advancedFeign; @GetMapping("/advanced/demo1") public String demo1() { return advancedFeign.demo1(Arrays.asList("one", "two", "three")); }
调用接口后输出日志:
[AdvancedFeign#demo1] ---> GET http://SERVICE-DEMO/simple/hello?list=one%2Ctwo%2Cthree HTTP/1.1 [AdvancedFeign#demo1] ---> END HTTP (0-byte body) [AdvancedFeign#demo1] <--- HTTP/1.1 200 (71ms) [AdvancedFeign#demo1] connection: keep-alive [AdvancedFeign#demo1] content-length: 11 [AdvancedFeign#demo1] content-type: text/plain;charset=UTF-8 [AdvancedFeign#demo1] date: Mon, 11 Nov 2024 03:08:52 GMT [AdvancedFeign#demo1] keep-alive: timeout=60 [AdvancedFeign#demo1] [AdvancedFeign#demo1] Hello World [AdvancedFeign#demo1] <--- END HTTP (11-byte body)
将日志中的 URL 进行解码,如下图: