REST 端点 request/filter 按 ID

REST endpoint request/filter by ids

要求:

我的第一个想法是在 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 应该用于发送数据以创建或更新资源。

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

What is the best way to design the endpoint to meet the requirements?

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

2020 年底,HTTP 工作组同意采用 SEARCH - 该方法的语义将被扩展以涵盖一些“GET with a body”的情况;等它标准化了,厂商开始支持它,那将是你最好的选择。

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

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

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