RESTApi EndPoint获取多个资源

时间:2017-08-05 07:11:13

标签: rest http api-design

该操作仅检索所有书籍中的请求。这显然是 GET 操作。

从你的角度来看,做这两个人的更好(赞成/赞成)是:

  • 注意:
  

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应用程序,以上所有这些方法都是有效的。

3 个答案:

答案 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方法的标准语义,因此符合各种软件的期望。例如:

  • 许多HTTP客户端知道他们可以在出现错误时自动重试GET请求
  • 缓存对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),但也可以像safeidempotent一样使用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]