存在 4xx 或 5xx Http 错误代码时在 Javascript 中解析 JSONP 响应

Posted

技术标签:

【中文标题】存在 4xx 或 5xx Http 错误代码时在 Javascript 中解析 JSONP 响应【英文标题】:Parsing JSONP Response in Javascript when 4xx or 5xx Http Error Code is Present 【发布时间】:2011-07-17 02:31:54 【问题描述】:

我正在实现一个应用程序,它依赖于 javascript 客户端和知道如何使用 JSONP 表示法响应客户端的服务器之间的通信。

我试图在我的 Javascript 客户端中处理我的服务器返回 4xx 或 5xx 的 http 状态代码的情况。目前我看到的是脚本没有被评估,因为浏览器认为它是一个错误(它是。)但是,我仍然想阅读我的服务器在这个 4xx 或 5xx 响应的情况下必须说什么我的 JavaScript 客户端中的代码。

我看到这确实会在脚本标记元素上引发错误,但我担心这不是跨浏览器,不会是一个可靠的解决方案。

即使 http 状态码是 4xx 或 5xx,有没有人幸运地仍然解析 jsonp 响应?

我开始相信我应该只使用这个“设置超时”解决方案,它通过声明 jsonp 请求的回调函数将在特定时间范围内完成来“检测”失败,如果没有,出现错误。

编辑:当我的服务器检测到 jsonp 客户端然后在返回的 json 对象中传送错误消息/状态时,我暂时总是返回 200 状态代码。我希望利用 HTTP 状态代码,但我认为这对于 javscript 客户端来说是行不通的。

【问题讨论】:

【参考方案1】:

使用 JSONP 的一种方法是在回调中嵌入状态信息。所以回调函数签名看起来像

callback(result, status, message)

所以如果你的电话看起来像

http://myurl.com/?callback=fn

为成功调用生成代码,如下所示

fn("data":"my great data", 200)

对于特殊情况

fn(null, 500, "server error"

【讨论】:

您知道如何使用 Lumen/Laravel 项目实现这一目标吗?【参考方案2】:

JSONP 是一种解决跨域问题的方法。当它工作时,它工作得很好。但是,如果没有,您将无法找出问题所在。

setTimeout 是在原来的基础之上的另一个 hack。如果您必须使用 JSONP 并且仍然需要错误检测(而不是处理),那就是您必须做的。没有更好的解决方案。

如果您控制服务器,请尝试使用跨域资源共享 (CORS) 或 Flash 的 crossdomain.xml 等替代方法来允许跨域请求。如果你不控制服务器,你可以通过你的服务器代理响应以获得更好的控制。

【讨论】:

在您看来,缺乏对 CORS 的跨浏览器支持是一个重大问题吗? en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing 这是一个重大问题,但所有其他解决方案也是如此。 CORS 适用于大多数新浏览器(包括移动 safari),但不适用于较旧的浏览器。 Flash 在桌面上是通用的,但不适用于移动设备。服务器端代理无处不在,但需要额外的工作。 JSONP 没有错误处理。选择较小的邪恶。【参考方案3】:

您可以检查 XHR 对象的status(如果您没有使用 JS 库)。

if(xhr.readyState == 4)
  if(xhr.status == 200)
    // good
  else if(xhr.status == 502)
    // d'oh
  

如果你使用 jQuery,你可以传入一个 statusCode 来处理 $.ajax 的特殊情况

【讨论】:

我正在使用 JSONP 绕过跨域限制。 en.wikipedia.org/wiki/JSON#JSONP 8.1 节 @Macy 看来我需要睡觉了 :p 不管怎样,here 也有类似的讨论。

以上是关于存在 4xx 或 5xx Http 错误代码时在 Javascript 中解析 JSONP 响应的主要内容,如果未能解决你的问题,请参考以下文章

5xx 或 4xx 错误,“不存在 'Access-Control-Allow-Origin' 标头”

Spring WebClient - 如何在 HTTP 错误(4xx、5xx)的情况下访问响应正文?

常见的HTTP返回码如4xx, 5xx

如何在 ASPNET.Core Web 应用程序中发送带有 CORS 标头的 HTTP 4xx-5xx 响应?

HTTP的response code 1xx,2xx,3xx,4xx,5xx分别代表什么

NGiNX - 没有为错误返回足够的标头(4xx,5xx)与成功(2xx)