【问题标题】:How to send an empty list as a parameter with feign?如何使用 feign 发送一个空列表作为参数?
【发布时间】:2019-05-08 08:38:23
【问题描述】:

我想用 feign 发送一个列表作为参数也可以在它为空时

目前在feign客户端我有以下方法:

@GetMapping("/artists")
List<Artist> getArtists(@RequestParam("genre") List<Long> genre);

它的问题是当genre是一个空列表时,feign创建请求GET /artists而不是GET /artists?genres=

我正在尝试对多个请求使用相同的 uri /artists,仅通过查询参数来区分它们,例如 GET /artists?genre=1,2,4 GET /artists?popularity=89 都被映射到不同的方法。

如何使用 feign 发送一个空列表作为参数?

【问题讨论】:

    标签: spring spring-cloud-feign feign


    【解决方案1】:

    您遇到的是empty 参数和undefined 参数之间的区别。 Feign在扩展uri参数时最好遵守RFC 6570 - Uri Templates。目前,仅支持简单扩展。规范指出,在处理未定义的值和列表时:

    2.3 Variables

    定义为列表值的变量被认为是未定义的,如果 列表包含零个成员。

    3.2.1 Variable Expansion

    未定义的变量(第 2.3 节)没有值并且是 被扩展过程忽略。如果一个变量中的所有变量 表达式是未定义的,那么表达式的扩展是 空字符串。

    通过提供一个空列表,根据定义,undefinedundefined 值将被忽略,从而导致根本不包含参数。如果要包含参数,无论列表是否包含任何值,都需要更新 uri 模板:

    @GetMapping("/artists?genre=")
    List<Artist> getArtists(@RequestParam("genre") List<Long> genre);
    

    这将在请求中包含genre=,即使列表为空。

    【讨论】:

    • 补充一点,如果 Feign 支持 3 级和 4 级模板,特别是表单样式查询扩展,则 uri 可以更新为 /artists{?genre}。这将允许这两种情况,但 Feign 目前仅支持 1 级模板。
    猜你喜欢
    • 2019-08-10
    • 2017-10-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多