我在工作中发现,人们正在设计一个rest API,该API具有基于查询参数(而不是路径参数)返回单个Json对象(而不是集合)的端点。例如:
/users?name=John&surname=Sparrow
带响应体
{id:10, name="John", surname="Sparrow", gender="male"}
但是在REST API中,由于查询参数而找不到资源的响应代码是什么?例如:
/users?name=John&surname=Smith
(当John Smith不存在时)。
我不认为这是一个404错误,因为/users端点存在,但我不知道我是否必须返回一个400错误或200没有主体(或空值)或其他类型的响应
你能帮我吗?
感谢什么是最合适的取决于空结果列表是OK的还是明显的失败。参数是PathParams还是QueryParams与返回码无关。
我的一般方法是,findStuffBySearchTerms等搜索函数总是返回成功的HTTP代码(如200)和结果或空列表。另一方面,fetchStuffById,我希望找到的实体将返回HTTP 404,如果它没有找到。
在REST API中对应于由于查询参数而未找到资源的响应代码是什么?
404 Not Found.
我不认为这是一个404错误,因为/users端点存在,
资源标识符包含查询参数。也就是说,查询参数是标识符的一部分,就像路径段是标识符的一部分一样。
在你的请求正文中,你可以尽可能精确地描述你的实现情况。
但是HTTP状态码的受众包括通用的组件(浏览器、代理、网络爬虫),对这些组件来说,响应代码是描述响应语义的主要机制:
状态码元素是一个3位数的整数码,描述服务器尝试理解并满足客户端相应请求的结果。响应消息的其余部分将根据为该状态码定义的语义进行解释。——RFC 7230
也就是说,你的服务器拥有自己的资源,因此你可以决定一个资源是否存在,以及它当前的表现形式是什么。
GET /users?name=Dave HTTP/1.1
200 OK
Content-Type: text/plain
Dave's not here, man.
从HTTP/REST帧,这是一个完全合理的交换;有人询问/users?name=Dave
的最新表示,最新表示是一个纯文本文档。绝对好。
这里的关键思想是HTTP状态码是通过网络域传输文档的元数据。
HTTP不关心资源表示的语义。
那说,你应该考虑在你的设计问题,如"这是什么样子在我们的访问日志?"如果您希望操作符能够将这种情况与查询参数匹配数据库中的信息的类似情况区分开来,那么200 vs 404是实现这一目标的自然方法。
在这种情况下,您通常会选择404而不是其他错误状态码,因为404表示响应是可缓存的,这可能是您在传递具有拼写错误的请求目标时所希望的。