【问题标题】:Parsing JSONP Response in Javascript when 4xx or 5xx Http Error Code is Present存在 4xx 或 5xx Http 错误代码时在 Javascript 中解析 JSONP 响应
【发布时间】: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 客户端来说是行不通的。

【问题讨论】:

    标签: javascript jsonp http-status-codes


    【解决方案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 的特殊情况

    【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多