我们通过提供 @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 进行解码,如下图:
