假设我有一个资源/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
,我不能简单地返回所有“书”。假设是这样一种情况,只有作者才能访问他们的书。
答案 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的阐述。