下面的操作仅检索请求中的所有书籍。这显然是一个GET操作。
从你的角度看,做这两件事最好(赞成/反对):
注:
获取-api/library/2/books/
从图书馆2检索所有的书。
使用get:
获取-api/library/2/books/3/5/10/33/../pages
使用post:
post-api/库/2/书/页
正文:
{
"books_id": [
2,
30,
40,
20,
30
]
}
在这里,我对使用post或get方法来实现这一点非常怀疑。如果有100-200本书需要检索,那么url上的图书id将变得非常混乱。我想在这里得到启发。
我使用php来处理rest应用程序,上面的所有方法都是有效的。
最佳答案
此操作符合GET方法的标准语义,因此符合各种软件的期望。例如:
许多http客户端都知道,如果出现错误,它们可以自动重试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中定义为一种“catch all”方法:
处理
请求中根据资源的
拥有特定的语义。例如,post用于
功能(除其他外):
o提供数据块,例如输入到html中的字段
表格,数据处理过程;
出于好奇,最近有人试图standardize a SEARCH method允许post这样的请求有效负载,但也可以safe和idempotent像get那样。不幸的是,这项工作已经停止了,所以您现在可能不应该尝试使用搜索。
从技术上讲,该协议允许您发送有效负载,即使有get请求,但正如RFC 7231 § 4.3.1所指出的,这是不寻常的,可能会导致问题:
get请求消息中的有效负载没有定义的语义;
在GET请求上发送有效载荷体可能会导致一些现有的
拒绝请求的实现。
关于rest - REST Api EndPoint获取多个资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45519293/