REST API 应该返回哪个HTTP状态码?

4

我是一位帮助翻译的助手。

我目前正在处理一个使用Spring作为后端和AngularJS作为前端的网站。我们已经讨论过后端如何处理前端消息对话框的响应,我有一个问题要问:

假设我有一个API:

GET : /getstatistics
Request params : fromTime,toTime ( in timestamp format)

如果客户端请求包含无效参数,比如字符串,那么服务器应该返回哪个响应代码?是HTTP 400 Bad Request并在响应正文中附带一条消息:“fromTime和toTime应该使用时间戳格式”,还是HTTP 200并返回相同的消息?
我看到谷歌的一些API(例如Oauth)会返回代码200来处理一个包含无效access_token的请求。但在我们的项目中,我的观点是应该返回HTTP 400,因为JavaScript具有成功和错误回调函数。如果只弹出一个红色对话框并显示消息,而不是返回HTTP 200代码,然后仍需要检查消息内容,这是否更好呢?
欢迎提供任何建议和意见。
谢谢!
3个回答

9
你应该返回一个400错误表示请求有误。可以参考这个文档。
服务器无法或不会处理由客户端引起的请求错误(例如,请求语法错误、无效的请求消息格式或欺骗性请求路由),这是一个客户端错误。
请参考RFC7231#section-6,客户端必须理解状态代码的类别,如第一个数字所示。
其中,4xx(客户端错误)表示请求包含错误的语法或无法完成。错误的语法可能是你在问题中提到的(使用无效参数发出请求,如字符串)。
当我设计RESTful API时,我经常查看这两个参考文献,也许对你有帮助:
  1. https://httpstatuses.com/
  2. http://www.restapitutorial.com/httpstatuscodes.html

谢谢,我猜这就是我例子中使用 Google 的原因。 - meobeo173
@meobeo173,可能会发送200以表示重定向成功,但我不确定。但是我非常确定使用200状态发送错误不是一个好主意。在我的看法中,您应该能够通过查看状态代码而不是有效负载来区分响应。此外,请查看此SO链接以获取更多参考信息:https://dev59.com/n14c5IYBdhLWcg3wc5_r - Divyanshu Maithani
"HTTP状态码是技术响应,而非业务逻辑响应。我发现了这句话,但在我的情况下,为了方便客户实施,对于有效的技术请求但无效的业务逻辑请求,响应错误代码是否重要呢?" - meobeo173
@meobeo173 我已经更新了我的答案,现在应该更有意义了。虽然最终有时取决于您的API设计,但希望这对您有所帮助。 - Divyanshu Maithani
是的,我研究了一下,有很多争论,但我认为代码最好还是自己说话。 - meobeo173
显示剩余2条评论

2

是的,你说得对,在你的情况下,http状态码应该是400。在这种情况下,你需要讨论的是是否需要返回400422。你可以查看这个Stack Overflow问题的已接受答案400 vs 422 response to POST of data


谢谢,但我仍需要更多细节或一些标准来理解。 - meobeo173
@meobeo173 我编辑了我的答案,包括更多细节。此外,您可以通过跟随我在答案中添加的链接找到更详细的回答。 - ettanany

0

我认为这与参数的使用有关。如果使用资源,则应返回404。如果数据不正确,则我们决定将请求状态设置为409。由于缺少/无效参数,它无法达到100%。

对于我们来说,“HTTP状态代码” 409冲突”是一个不错的尝试,因为其定义要求包含足够的信息,以便用户识别冲突的源。

参考资料:w3.org/Protocols/

编辑: 无论如何,在此处使用状态代码200是不正确的,因为存在错误。作为响应,您可以返回特定信息,例如:

{
  "errors": [
   {
    "userMessage": "Sorry, the parameter xxx is not valid",
    "internalMessage": "Invalid Time",
    "code": 34,
    "more info": "http://localhost/"
   }
  ]
} 

你说的参数使用方式是什么意思?通常只有在资源本身无法路由或无法通过URL找到时(即客户端调用/user而不是/users)才会返回404。如果资源状态有问题而不是URL本身,则409是有意义的。在OP的情况下,似乎请求参数格式不正确,因此400可能比404或409更合适。这是我用作参考的好网站http://www.restapitutorial.com/httpstatuscodes.html - Derrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接