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 端点已关闭。
420
Enhance 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的问题
AJAX请求服务器,响应状态码为200,但调用error函数