REST API:资源需要按ID过滤,但未指定ID

时间:2018-07-13 16:30:48

标签: rest api-design

假设我有一个资源/books,它的参数为?author_id=。如果未指定author_id参数,例如/books而不是/books?author_id=42,应该返回什么?我部分基于this answer,我决定,如果您点击/books?author_id=42,如果作者42没有书籍,那么您将得到一个空集合,而不是例如返回404。

但是,在client_id为null的情况下,我不确定是否应该以相同的方式处理这种情况(即,ID为null的作者没有书籍)还是应该是像400,将null作为client_id的无效值。

还要注意,books是一个人为的示例,在我的情况下,如果用户点击/books,我不能简单地返回所有“书”。假设是这样一种情况,只有作者才能访问他们的书。

3 个答案:

答案 0 :(得分:0)

  

如果未指定author_id参数,例如,   / books与/ books?author_id = 42相对?

如果资源URL有效/books,但是服务器无法处理此特定请求,则我将首选HTTP 501 Not Implemented作为响应代码。因为服务器负责不支持此功能。这是值得商as的,因为有些人会更喜欢4xx HTTP代码,但是在我看来4xx错误状态代码将矛头指向了客户端。

W3 HTTP 501的标准定义

  

10.5.2 501未实现服务器不支持满足请求所需的功能。这是合适的   服务器无法识别请求方法并且是   无法为任何资源提供支持。

  

我已决定,如果您点击/ books?author_id = 42,您将获得一个   如果作者42没有书籍,则返回空集合,而不是例如返回   404。

这很好。

下一个问题-

  

但是,在client_id为null的情况下,我不确定是否应该   以相同的方式对待这种情况(即ID为null的作者具有   没有书籍),或者应该是400左右的东西,则将null视为   client_id的值无效

这也很好。由于客户端发送的ID无效,并且可以从客户端进行更正,因此400 Bad Request适用于这种情况。

答案 1 :(得分:0)

基本上,这取决于您自己如何处理。

我根据Microsoft REST API Guidelines开发了一些RESTful API,其中包含最佳实践。

根据其准则,REST客户端必须期望可以以页面大小返回收集数据。

如果提供分页结果,则还希望对大集合提供过滤;因此请过滤作者的收藏集。

它们使用样式为filtering的'OData'进行排序和分页。我将引用实际的“过滤”一章:

  

$ filter querystring参数允许客户端过滤   请求URL寻址的资源的集合。的   $ filter指定的表达式将为中的每个资源求值   集合,并且只有表达式计算结果为true的项目   包含在响应中。 表达式所针对的资源   评估为false或null,或者哪些引用属性为   由于权限而无法使用,因此在响应中被忽略   (问题的答案:这意味着您应该返回一个空的分页结果)

     

示例:返回价格低于$ 10.00的所有产品

     

GET https://api.contoso.com/v1.0/products?$filter=price lt 10.00

     

$ filter选项的值是一个布尔表达式。

答案 2 :(得分:-2)

首先,在上面的示例中,/ books?author_id = 42不是令人讨厌的imo(无疑会发生一些宗教性的讨论)。 / books / 42将是“让我的ID = 42的书”。相反,API应该将请求正文中的过滤器参数作为选择标准。 / books将包括与嵌入式过滤条件匹配的所有书籍,可能会进行null收集。

如果需要,API还可以检查某些过滤条件(作者)是否有效,如果作者不存在,则返回404。那是API的决定,UI只知道如何与之交谈并处理结果。

请注意我的预期?宗教讨论以及支票付款。阅读有关Roy Fielding的工作和Leonard Richardson的阐述。