【问题标题】:REST endpoint request/filter by idsREST 端点请求/按 id 过滤
【发布时间】:2021-06-03 00:25:46
【问题描述】:

要求:

  • REST Api 用户可以通过提供List/Set/Array 的 id (UUIDs) 来查询实体列表
  • 端点返回List 的请求实体。如果未找到任何内容,请清空 List。
  • 查询的 id (UUIDs) 数量不受限制。

我的第一个想法是在我的RestController 中使用这样的 GET 端点:

@GetMapping(path = "{ids}")
public List<FooResponseTO> getFoos(@PathVariable @NotEmpty Set<UUID> ids) {
    return someService.getFoos(ids);
}

这个想法似乎不是最优的,因为 URL 长度是有限的(例如在浏览器中)。我认为最好将 id 移动到请求正文中,但对于 GET 请求不建议这样做。使用 POST 而不是 GET 似乎也是错误的,因为 GET 应该用于从指定资源请求数据,而 POST 应该用于发送数据以创建或更新资源。

设计端点以满足要求的最佳方式是什么?

【问题讨论】:

    标签: java spring-boot rest spring-restcontroller


    【解决方案1】:

    设计端点以满足要求的最佳方式是什么?

    今天没有“最好”的方法来做到这一点。只是一堆不同的妥协。

    在 2020 年底,HTTP 工作组同意采用SEARCH——该方法的语义将被扩展以涵盖一些“GET with a body”的情况;当它已经标准化并且供应商开始支持它时,这将是您的最佳选择。

    同时,您的标准化选项是 GET(在 URI 中编码的 URI 的任意列表,以及超出 URI 长度限制的责任)和 POST(失去安全语义的优势,并损害缓存)。

    另一种可能性是将您的资源模型从细粒度(准确地询问您想要的标识符)切换到粗粒度(获取标识符页面,让客户获取他们想要的标识符)。由于缓存,粗粒度资源更“适合”大型应用程序。

    如果您不限于标准化的选择(例如,因为您同时控制客户端和服务器),那么您还可以考虑使用非标准化的 SEARCH 方法标记,或者发明自己的方法标记来准确表示什么你需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 2018-12-04
      相关资源
      最近更新 更多