REST Api 端点获取多个资源

RESTApi EndPoint GET Multiple Resources

下面的操作仅检索请求中的所有书籍。明明是GET操作。

从您的角度来看,执行以下两个操作更好 (pro/cons):

GET - api/library/2/books/

从图书馆 2 中检索所有书籍。

GET - api/library/2/books/3/5/10/33/...../pages

POST - api/library/2/books/pages

正文:

{
    "books_id": [
        2,
        30,
        40,
        20,
        30
    ]
}

我真的很怀疑是使用 POST 还是 GET 方法来实现它。如果要检索 100-200 本书,URL 上的图书 ID 会变得非常混乱。我想在这里得到一些启示。

我正在使用 PHP 来处理 Rest 应用程序,上述所有方法均有效。

POST 在你的情况下看起来语义不正确。也许你可以尝试查询参数

GET - api/library/2/books/pages?ids=[1,2,3,4,5]

查询参数

要检索多本书籍,请考虑查询参数(使用?):

GET /api/library/2/books?id=3,5,10,33

矩阵参数

要检索多本书籍,您可以考虑矩阵参数(使用;):

GET /api/library/2/books;id=3,5,10,33/pages

那么您也可以使用查询参数来过滤页面。


• 有关矩阵和查询参数的更多详细信息,请参阅此 question

• 另请参阅 RFC 3986 for more details: §3.3 Path and §3.4 Query

的以下部分

这个操作符合GET方法的标准语义,因此符合各种软件的期望。例如:

  • 许多 HTTP 客户端都知道它们可以在出错时自动重试 GET 请求
  • 更容易缓存对 GET 的响应

如果您的图书 ID 独立于图书馆 ID,那么最好删除对图书馆的引用,只做

GET /api/books/3,5,10,33/pages

Books Ids on URL will get really messy if there was like 100-200 books to retrieve

如果每个图书 ID 的长度都是 6 位,那么加起来只有 700-1400 字节。这完全在任何好的 HTTP 客户端支持的范围内。要真正突破 URL 长度的实际限制,您需要更多书籍 — 但您真的需要(或想要)支持一次检索这么多页吗?

(不过,或者,您的图书 ID 可能更长 — 可能是 UUID。)

如果您 运行 限制了 URL 长度,则可以将 POST 用于专用“端点”:

POST /api/books/bulk-pages

{"books_id": [3, 5, 10, 33]}

POST 在 RFC 7231 § 4.3.3 中被定义为一种“包罗万象”的方法:

process the representation enclosed in the request according to the resource's own specific semantics. For example, POST is used for the following functions (among others):

o Providing a block of data, such as the fields entered into an HTML form, to a data-handling process;

出于好奇,最近有人尝试 standardize a SEARCH method that would allow request payloads like POST, but also be safe and idempotent 喜欢 GET。不幸的是,这项工作已经停滞,所以您现在可能不应该尝试使用 SEARCH。

从技术上讲,该协议允许您使用 GET 请求发送有效载荷,但正如 RFC 7231 § 4.3.1 指出的那样,这是不寻常的,可能会导致麻烦:

A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.