HTTP状态码表示数据错误。

43

当客户端提交错误数据(例如期望输入整数但提交了字符串)时,我应该返回什么HTTP状态码?

我一直在使用400 Bad Request,但根据阅读HTTP文档,这似乎更适用于HTTP协议错误。

我希望使用一个状态码,以便Flash和AJAX客户端可以区分成功、错误数据和服务器错误,而无需解析响应内容。


可能是Right HTTP status code to wrong input的重复问题。 - Gabriel Caruso
3个回答

54

这正是400状态码存在的原因。是的,它用于处理不良的HTTP协议使用情况,但并非仅限于此。


1
根据OP的问题,如果客户端发出了一个预期的“整数”HTTP请求。然而,假设该整数表示用户的“id”。如果服务器找不到该用户,是否也应返回“400”? - Kevin Meredith
10
在那种情况下,状态码为404将是最好的事情。 - DasDave
@KevinMeredith 返回适当的HTTP状态码取决于请求的上下文。对于REST API调用,如果客户端在未找到数据时期望返回一个空对象,则返回200 OK状态码是合适的。对于期望URL参数的页面导航用户,返回404 Not Found状态码并显示自定义404页面是合适的。 - Luca Fagioli

10

如果语法错误,请使用"400 Bad Request"

由于格式不正确,服务器无法理解请求。客户端不应重复未经修改的请求。

如果数据错误(且语法正确),请使用“422 Unprocessable Entity”

422(Unprocessable Entity)状态代码表示服务器了解请求实体的内容类型(因此415(不支持的媒体类型)状态代码不合适),并且请求实体的语法是正确的(因此400(错误请求)状态代码不合适),但无法处理所包含的指令。例如,如果XML请求正文包含形式良好(即语法正确)但语义上错误的XML指令,则可能发生此错误条件。

参见https://www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm

另请参见https://softwareengineering.stackexchange.com/a/342896/158699答案,其中包括正确的400和422代码。


7
我更倾向于在客户端点击提交按钮时将错误数据捕获回浏览器。 否则,我会返回400,因为标准规定如下: “由于格式不正确,服务器无法理解请求。客户端不应该重复请求而不做修改。”

7
你最好两个都做。不能保证你的 API 被浏览器使用了。 :) - weberc2
2
永远不要相信用户界面会发出正确的请求。你一定应该返回 400。 - Bill Dagg

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