RESTAPI应该返回哪个HTTP代码?
我目前正在一个后端有Spring,前端有Angularjs的网站上工作,我们已经讨论了后端响应以处理前端的消息对话框,我有一个问题要问: 假设我有一个API:RESTAPI应该返回哪个HTTP代码?,rest,http,Rest,Http,我目前正在一个后端有Spring,前端有Angularjs的网站上工作,我们已经讨论了后端响应以处理前端的消息对话框,我有一个问题要问: 假设我有一个API: GET : /getstatistics Request params : fromTime,toTime ( in timestamp format) 若客户机发出一个带有无效参数(如字符串)的请求,那个么应该从服务器返回哪个响应代码?HTTP 400错误的请求和响应正文包含消息“fromTime和toTime应采用时间戳格式”,还是
GET : /getstatistics
Request params : fromTime,toTime ( in timestamp format)
若客户机发出一个带有无效参数(如字符串)的请求,那个么应该从服务器返回哪个响应代码?HTTP 400错误的请求和响应正文包含消息“fromTime和toTime应采用时间戳格式”,还是HTTP 200包含相同的消息
我看到了一些Google的API,例如Oauth,他们返回代码200,用于带有无效访问令牌的请求,但在我们的项目中,我认为应该是HTTP 400,因为Javascript有成功和错误回调,如果只弹出一个带有消息的红色对话框,而不是HTTP 200代码,那么仍然需要检查消息的内容,这样更好吗?
任何建议和意见都将不胜感激
谢谢 是的,您是对的,您的http代码应该是
400
。这里的讨论通常应该是您是否需要返回400
或422
。为此,您可以检查此问题的已接受回答,因此对于错误请求,您应该返回一个400
错误。查看参考资料
由于某些原因,服务器无法或将不会处理该请求
这被认为是客户端错误(例如,格式错误的请求
语法、无效请求消息帧或欺骗请求
路由)
请看一看
客户机必须了解任何状态代码的类别,如
第一位
以及
4xx(客户端错误):请求包含错误语法,或者无法执行
履行
错误的语法可能与您在问题中提到的类似(使用无效参数发出请求,如字符串)
无论何时设计RESTful API,我都会将这两个参考资料放在手边,这可能对您也有帮助:
我认为这与如何使用参数有关。如果您使用该资源,那么404应该返回。如果数据根本无效,那么我们决定为请求设置409状态。由于缺少/无效参数,无法100%填充 HTTP状态代码“409冲突”对我们来说是一个很好的尝试,因为它是 定义要求包含足够的信息,以便用户 认识到冲突的根源 参考: 编辑: 在任何情况下,此处的状态代码200都不正确,因为存在错误。作为响应,您可以返回如下特定信息:
{
"errors": [
{
"userMessage": "Sorry, the parameter xxx is not valid",
"internalMessage": "Invalid Time",
"code": 34,
"more info": "http://localhost/"
}
]
}
谢谢,但我仍然需要更多的细节或一些标准来理解。@meobeo173我编辑了我的答案以包含更多细节。另外,你可以通过我在答案中添加的链接找到更详细的回复。谢谢,我想这就是谷歌出现在我的博客中的原因example@meobeo173它可能会发送200以成功重定向,对此不确定,但我很确定发送状态为200的错误不是一个好主意。您应该能够通过查看状态代码而不是有效负载IMHO来区分您的响应。另外,请查看此SO链接以获取进一步参考::“HTTP状态代码是技术响应,而不是业务逻辑响应”我找到了此引用,但在我的情况下,为了简化客户端实现,我认为响应有效技术但无效业务逻辑请求的错误代码无关紧要?@meobeo173在业务逻辑失败的情况下,可以使用
200
进行响应,但因为我们讨论的是REST,我们使用HTTP作为应用程序级协议,更好的设计是让您的状态代码自己说话(客户端错误->4xx,服务器端错误->5xx)。虽然没有明确的规则,但有时线条会变得模糊。@meobo173我已经更新了我的答案,现在应该更有意义了。虽然,最终它有时会归结为您的API设计,希望这是有帮助的。您所说的参数如何使用是什么意思?如果资源本身不可路由/无法通过URL找到(即客户端调用了/user而不是/users),我通常只返回404。如果资源的状态而不是URL本身有问题,409是有意义的。在OP的例子中,听起来请求参数的格式不正确,因此400可能比404或409更合适。这是一个我用来参考的好网站