REST Api 端点获取多个资源
RESTApi EndPoint GET Multiple Resources
下面的操作仅检索请求中的所有书籍。明明是GET操作。
从您的角度来看,执行以下两个操作更好 (pro/cons):
- 注:
GET - api/library/2/books/
从图书馆 2 中检索所有书籍。
- 使用 GET:
GET - api/library/2/books/3/5/10/33/...../pages
- 使用POST:
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.
下面的操作仅检索请求中的所有书籍。明明是GET操作。
从您的角度来看,执行以下两个操作更好 (pro/cons):
- 注:
GET - api/library/2/books/
从图书馆 2 中检索所有书籍。
- 使用 GET:
GET - api/library/2/books/3/5/10/33/...../pages
- 使用POST:
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.