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