了解REST响应和HTTP状态代码

Phi*_*ord 1 rest json http http-status-codes

我想知道如何在REST API中做出响应.

有效示例:

http://blah.com/api/v1/dosomething/123
Run Code Online (Sandbox Code Playgroud)

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

{
    "dosomething": {
        "status": "OK",
        "results": "123"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,如果传递的参数无效(我期待一个整数字符串),我是否返回HTTP响应200并在JSON响应中传回错误状态,或者我应该传递类似HTTP的内容400响应(错误请求)并在JSON响应中列出请求的错误/问题?

错误示例:

http://blah.com/api/v1/dosomething/123a
Run Code Online (Sandbox Code Playgroud)

JSON响应:

{
    "dosomething": {
        "status": "ERROR",
        "errors": [
            "Value passed: |123a| must be a integer."
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题再一次是我应该在请求传递200或400 HTTP状态,其中传递的参数不是我所期望的?或者,当请求有效时,这应该始终是200响应吗?

什么是最佳做法?

fum*_*chu 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的论文:

"资源不是存储对象.资源不是服务器用来处理存储对象的机制.资源是概念映射 - 服务器接收标识符(标识映射)并将其应用于当前映射实现(通常是特定于集合的深层树遍历和/或散列表的组合)来查找当前负责的处理程序实现,然后处理程序实现根据请求内容选择适当的操作+响应.所有这些特定于实现的问题隐藏在Web界面后面;只有通过Web界面访问的客户端才能承担它们的本性."