OpenFeign CollectionFormat 的支持

我们通过提供 @CollectionFormat 注解来支持 feign.CollectionFormat。

feign.CollectionFormat 是 Feign 框架中的一个枚举类型。它主要用于定义在将集合类型(如 List、Set等)的参数转换为 HTTP 请求参数时的格式。这对于正确地构建 HTTP 请求,将 Java 中的集合数据发送到远程服务端点是非常重要的。

CollectionFormat 取值

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);
    //...
}

CollectionFormat 示例

在下面的例子中,使用 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 进行解码,如下图:

c2fb1ba038511cc7039afecb35dc1891_1731294615251-c7c2c693-4ef3-4f8a-8124-6a2e5e597f0c_x-oss-process=image%2Fformat%2Cwebp.png

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号