我想知道如何在REST API中做出回应。
有效示例:
http://blah.com/api/v1/dosomething/123
以上是有效请求,目前我的HTTP状态为200,带有JSON响应
{
"dosomething": {
"status": "OK",
"results": "123"
}
}
现在我的问题是,如果传递的参数无效(我期待一个整数字符串),我是否会返回HTTP响应200并在JSON响应中返回错误状态或者我应该传递类似HTTP 400响应(错误请求)的内容,并在JSON响应中列出请求的错误/问题?
错误示例:
http://blah.com/api/v1/dosomething/123a
JSON响应:
{
"dosomething": {
"status": "ERROR",
"errors": [
"Value passed: |123a| must be a integer."
]
}
}
我的问题是,我应该在请求中传递200或400 HTTP状态,其中传递的参数不是我所期望的吗?或者,如果请求有效,这应该总是200响应吗?
什么是最佳做法?
答案 0 :(得分:5)
使用404.总是。 404.否则就是误解了URI和资源的性质。如果http://blah.com/api/v1/dosomething/
标识了资源,并且123a
仅仅是其中的参数,则其他代码可能有意义。但它没有:http://blah.com/api/v1/dosomething/123
标识资源。如果不存在此类资源,请返回404 Not Found
。
您可能拥有处理资源http://blah.com/api/v1/dosomething/123
和http://blah.com/api/v1/dosomething/123a
的一些实现细节,但它不是资源。来自Roy Fielding的dissertation:
“资源不是存储对象。资源不是 服务器用于处理存储对象的机制。该 resource是概念映射 - 服务器接收标识符 (标识映射)并将其应用于其当前映射 实现(通常是特定于集合的深树的组合 遍历和/或哈希表)来查找当前负责的 处理程序实现和处理程序实现然后选择 基于请求内容的适当行动+响应。所有这些 特定于实现的问题隐藏在Web界面后面; 他们的性质不能由只有访问权限的客户承担 通过Web界面。“
答案 1 :(得分:4)
按作者编辑:422是错误的答案。我误解了最初的问题并给出了无效的答案。请参阅@fumanchu的回复:https://stackoverflow.com/a/10955717/441250。我的回答是错误的。
我建议使用“422 Unprocessable Entity”并在您的回复正文中包含失败信息。
422(不可处理实体)状态代码表示服务器
了解请求实体的内容类型(因此a 415(不支持的媒体类型)状态代码不合适),和 请求实体的语法是正确的(因此是400(错误请求)
状态代码不合适但是无法处理包含的内容 说明。例如,如果XML为XML,则可能出现此错误情况 请求正文包含格式正确(即语法正确),但是 语义错误的XML指令。
在处理错误时使用“200 Ok”或任何其他状态代码是不可接受的。
P.S。 状态代码列表: http://www.iana.org/assignments/http-status-codes/http-status-codes.xml
答案 2 :(得分:-2)
HTTP 400用于表示HTTP请求本身的问题(例如无效的HTTP标头)。虽然您没有收到预期的参数,但请求仍然是有效的HTTP请求,因此我会返回200响应,但在JSON中包含缺失参数的详细信息。