了解REST响应和HTTP状态代码

时间:2012-06-08 14:36:21

标签: json http rest http-status-codes

我想知道如何在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响应吗?

什么是最佳做法?

3 个答案:

答案 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/123http://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中包含缺失参数的详细信息。