该操作仅检索所有书籍中的请求。这显然是 GET 操作。
从你的角度来看,做这两个人的更好(赞成/赞成)是:
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应用程序,以上所有这些方法都是有效的。
答案 0 :(得分:1)
要检索多个图书,请考虑查询参数(使用?
):
GET /api/library/2/books?id=3,5,10,33
要检索多个图书的页 ,您可以考虑矩阵参数(使用;
):
GET /api/library/2/books;id=3,5,10,33/pages
然后您还可以使用查询参数来过滤网页。
•有关矩阵和查询参数的更多详细信息,请参阅此question。
•有关详情,请参阅RFC 3986的以下部分:§3.3 Path和§3.4 Query
答案 1 :(得分:1)
此操作符合GET方法的标准语义,因此符合各种软件的期望。例如:
如果您的图书ID独立于图书馆ID,那么最好放弃对图书馆的引用,并且只做
GET /api/books/3,5,10,33/pages
如果有100-200本书要检索,那么URL上的书籍ID会变得非常混乱
如果每本书的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中被定义为一种“全能”方法:
处理 根据资源包含在请求中的表示 拥有特定的语义。例如,POST用于以下内容 功能(等等):
o提供数据块,例如输入HTML的字段 形式,数据处理过程;
作为一种好奇心,最近尝试standardize a SEARCH method允许请求有效负载(如POST),但也可以像safe和idempotent一样使用GET。不幸的是,这种努力已经停滞,所以你现在可能不应该尝试使用SEARCH。
从技术上讲,该协议允许您发送有效负载,即使有GET请求,但作为RFC 7231 § 4.3.1注释,这是不寻常的,可能会造成麻烦:
GET请求消息中的有效负载没有定义的语义; 在GET请求上发送有效负载主体可能会导致一些存在 拒绝请求的实现。
答案 2 :(得分:0)
POST 在语义上看起来不正确。也许你可以尝试像
这样的查询参数GET - api / library / 2 / books / pages?ids = [1,2,3,4,5]