3

我想知道我应该如何在我的 REST API 中做出响应。

有效示例:

http://blah.com/api/v1/dosomething/123

以上是一个有效的请求,目前我的 HTTP 状态为 200,带有 JSON 响应

{
    "dosomething": {
        "status": "OK",
        "results": "123"
    }
}

现在我的问题是,如果传递的参数无效(我期待一串整数),我是返回 200 的 HTTP 响应并在 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 响应?

什么被认为是最佳实践?

4

3 回答 3

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,但它不是资源。来自罗伊菲尔丁的论文

“资源不是存储对象。资源不是服务器用来处理存储对象的机制。资源是一个概念映射——服务器接收标识符(标识映射)并将其应用于当前映射实现(通常是集合特定的深度树遍历和/或哈希表的组合)以找到当前负责的处理程序实现,然后处理程序实现根据请求内容选择适当的动作+响应。所有这些特定于实现的问题隐藏在 Web 界面后面;只能通过 Web 界面访问的客户端无法假定它们的性质。”

于 2012-06-08T20:34:27.890 回答
4

作者编辑:422 是错误的答案。我误解了最初的问题并给出了无效的答案。请参阅@fumanchu 的回复:https ://stackoverflow.com/a/10955717/441250 。我下面的回答是错误的。

我建议使用“422 Unprocessable Entity”并在您的回复正文中包含失败信息。

422(Unprocessable Entity)状态码意味着服务器
理解请求实体的内容类型(因此
415(Unsupported Media Type)状态码是不合适的),并且
请求实体的语法是正确的(因此是 400(Bad Request) )
状态码不合适)但无法处理包含的指令。例如,如果 XML
请求正文包含格式正确(即语法正确)但
语义错误的 XML 指令,则可能会出现这种错误情况。

在处理错误时使用“200 Ok”或任何其他状态码是不可接受的。

PS 状态码列表: http ://www.iana.org/assignments/http-status-codes/http-status-codes.xml

于 2012-06-08T15:02:18.070 回答
-2

HTTP 400 用于表示 HTTP 请求本身存在问题(例如无效的 HTTP 标头)。尽管您没有收到您期望的参数,但该请求仍然是有效的 HTTP 请求,因此我将返回 200 响应,但在您的 JSON 中包含缺少参数的详细信息。

于 2012-06-08T14:50:32.770 回答