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

当存在4xx或5xx Http错误代码时,在Javascript中解析JSONP响应,javascript,jsonp,http-status-codes,Javascript,Jsonp,Http Status Codes,我正在实现一个应用程序,它依赖于JavaScript客户机和服务器之间的通信,服务器知道如何使用JSONP符号响应客户机 我试图在Javascript客户端中处理这样的情况:服务器返回的http状态代码为4xx或5xx。目前我看到的是,由于浏览器认为它是一个错误(事实确实如此),所以没有对脚本进行评估。但是,我仍然希望阅读服务器在JavaScript客户端出现4xx或5xx响应代码时所说的话 我看到这确实会在script标记元素上引起错误,但我担心这不是跨浏览器的,也不是一个健壮的解决方案 即使

我正在实现一个应用程序,它依赖于JavaScript客户机和服务器之间的通信,服务器知道如何使用JSONP符号响应客户机

我试图在Javascript客户端中处理这样的情况:服务器返回的http状态代码为4xx或5xx。目前我看到的是,由于浏览器认为它是一个错误(事实确实如此),所以没有对脚本进行评估。但是,我仍然希望阅读服务器在JavaScript客户端出现4xx或5xx响应代码时所说的话

我看到这确实会在script标记元素上引起错误,但我担心这不是跨浏览器的,也不是一个健壮的解决方案

即使http状态代码是4xx或5xx,是否有人仍然能够解析jsonp响应

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


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

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


如果您使用的是jQuery,那么可以传入一个
statusCode
来处理特殊情况JSONP是一种解决跨域问题的黑客。当它工作时,它工作得很好。但如果没有,你就无法找出哪里出了问题

setTimeout是在原来的基础上的另一个黑客。如果您必须使用JSONP并且仍然需要错误检测(而不是处理),那么您就必须这样做。没有更好的解决办法了


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

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

callback(result, status, message)
所以如果你的电话看起来像

http://myurl.com/?callback=fn
fn({"data":"my great data"}, 200)
为成功调用生成代码,如下所示

http://myurl.com/?callback=fn
fn({"data":"my great data"}, 200)
在特殊情况下

fn(null, 500, "server error"}

我使用JSONP绕过跨域限制。第8节。1@Macy看起来我需要一些睡眠:p无论如何,也有类似的讨论。在你看来,CORS缺乏跨浏览器支持是一个重大问题吗?这是一个重大问题,但所有其他解决方案也是如此。CORS适用于大多数新浏览器(包括mobile safari),但不适用于旧浏览器。Flash在桌面上是通用的,但在移动设备上不起作用。服务器端代理可以在任何地方工作,但需要额外的工作。JSONP没有错误处理。选择较小的邪恶。你知道如何使用Lumen/Laravel项目实现这一点吗?