JSON 响应 Ajax 调用的正确状态代码?

Posted

技术标签:

【中文标题】JSON 响应 Ajax 调用的正确状态代码?【英文标题】:Proper status codes for JSON responses to Ajax calls? 【发布时间】:2011-06-28 15:06:03 【问题描述】:

我的项目正在从浏览器返回 JSON 到 Ajax 调用。我想知道什么是正确的状态代码,用于返回对无效(但已成功处理)数据提交的响应。

例如,jQuery 在发出 Ajax 请求时有以下两个特定的回调:

success:当 200/2xx 状态代码与响应一起传递时触发。

error:当 4xx、5xx 等状态码随响应返回时触发。

如果用户尝试创建一个新的“Person”对象,我会在成功时发回新创建的对象的 JSON 表示,从而使 javascript 可以访问新对象所需的唯一 ID,等等。这当然是, 发送一个 200 状态码。

如果用户提交格式错误或无效的数据(例如,无效/不完整的“名称”字段),我想通过 JSON 发回验证错误消息。 (我不明白为什么这会是一件坏事)。

我的问题是:在这样做时,我是否应该发送一个200状态码,因为我成功处理了他们的无效数据?因此,我将使用 jQuery success 回调,但只需检查错误...

或者,我应该使用 4xx 状态码,也许是“错误请求”,因为他们发送给我的数据无效吗? (因此,使用error 回调来执行必要的客户端通知)。

【问题讨论】:

我知道并确信除了我给出的关于导致 jQuery 触发我提到的回调的原因的简单解释之外,还有更多的细节。只是想让我对描述的理解简短而简单。 【参考方案1】:

我同意 400 Bad Request 响应。

为了获得灵感,您可以看看 Twitter(广泛使用的 JSON 服务)如何做到这一点: https://dev.twitter.com/overview/api/response-codes

Code Text 说明

200 OK - 成功! 304 Not Modified - 没有要返回的新数据。 400 Bad Request - 请求无效或无法以其他方式提供服务。随附的错误消息将进一步解释。未经身份验证的请求被视为无效,并将产生此响应。 401 Unauthorized - 缺少或不正确的身份验证凭据。在其他情况下也会返回(例如,对 API v1 端点的所有调用都返回 401)。 403 Forbidden - 请求被理解,但已被拒绝或不允许访问。随附的错误消息将解释原因。当请求因更新限制而被拒绝时使用此代码。下表中的响应代码旁边列出了返回此状态的其他原因。 404 Not Found - 请求的 URI 无效或请求的资源(例如用户)不存在。当请求的方法不支持请求的格式时也返回。 406 Not Acceptable - 在请求中指定无效格式时返回。 410 Gone - 此资源已消失。用于指示 API 端点已关闭。 420Enhance Your Calm 当应用程序受到速率限制时返回。 422 Unprocessable Entity - 当无法处理上传到 POST 帐户/update_profile_banner 的图像时返回。 429 Too Many Requests - 由于资源的应用程序的速率限制已用尽而无法处理请求时返回。请参阅速率限制。 500 Internal Server Error = 东西坏了。请在开发者论坛上发布您的请求的其他详细信息,以防其他人遇到类似问题。 502 Bad Gateway - Twitter 已关闭或正在升级。 503 Service Unavailable - Twitter 服务器已启动,但请求超载。稍后再试。 504 Gateway Timeout - Twitter 服务器已启动,但由于我们堆栈中的某些故障,无法处理请求。请稍后再试。

【讨论】:

注意我已经实现了一个相当大的 API,使用 200 来处理应用程序级别的错误(然后由 JSON 响应正文描述),并且我知道@MPV 是正确的。处理代表应用程序级错误的 200 OK HTTP 所需的额外解析逻辑和代码流只会使您的错误处理复杂化。坚持 2XX 状态意味着成功,所有错误都有 4XX 或 5XX 状态码。它使您的成功处理代码更容易。 更新了 Twitter 代码的 URL:dev.twitter.com/overview/api/response-codes【参考方案2】:

我会发回一个“400 Bad Request”标头作为响应,其中包含 json 中的错误信息。 然后使用 jquerys $.ajaxError() 事件处理程序捕获事件并解析我得到的错误消息作为回报,以向最终用户提供良好的反馈。

您可以阅读有关 ajaxError 事件处理程序here 的更多信息!

【讨论】:

以上是关于JSON 响应 Ajax 调用的正确状态代码?的主要内容,如果未能解决你的问题,请参考以下文章

AWS CORS 问题:即使在获得 200 状态代码后,Ajax 响应也会出现错误

jquery ajax 后台响应成功,返回正确json但不执行success方法,执行error的问题

修改响应标头时,WCF Web 服务未返回正确的状态代码

AJAX请求服务器,响应状态码为200,但调用error函数

当 extjs 中有代理 ajax 调用时,如何从响应中获取内容类型?

已启用 CORS,但在 POST JSON 时,预检响应的 HTTP 状态代码 404 无效