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

时间:2011-03-17 02:59:34

标签: javascript jsonp http-status-codes

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

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

我发现这确实会引起脚本标记元素的错误,但我担心这不是跨浏览器,也不会是一个强大的解决方案。

即使http状态代码是4xx或5xx,有没有人还在解析jsonp响应?

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

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

3 个答案:

答案 0 :(得分:8)

JSONP是解决跨域问题的黑客攻击。当它工作时,它运作良好。但是当它没有时,你没有办法弄清楚出了什么问题。

setTimeout是原始版本之上的另一个黑客攻击。如果你必须使用JSONP并仍然需要错误检测(不处理),那就是你必须要做的。没有更好的解决方案。

如果您控制服务器,请尝试使用Cross-Origin-Resource-Sharing(CORS)或Flash的crossdomain.xml等替代方案来允许跨域请求。如果您不控制服务器,则可以通过服务器代理响应以获得更好的控制。

答案 1 :(得分:7)

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

callback(result, status, message)

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

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

为成功调用生成代码,该代码看起来像

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

和特殊情况

fn(null, 500, "server error"}

答案 2 :(得分:-3)

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

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

如果您使用的是jQuery,则可以传递statusCode来处理$.ajax的特殊情况