当我使用 .ajax 和 JSONP 时,如何处理失败的 JSON 请求?

Posted

技术标签:

【中文标题】当我使用 .ajax 和 JSONP 时,如何处理失败的 JSON 请求?【英文标题】:How do I handle a JSON request that fails when I'm using .ajax and JSONP? 【发布时间】:2011-10-05 14:53:00 【问题描述】:

我正在编写一个小的 reddit 图片查看应用程序,如果用户输入有效的子 reddit,它可以正常工作。但我正在尝试处理不存在的 reddit 的情况,但无法弄清楚。

function load_data(after) 
    $.ajaxSetup(
        "error": function () 
            // this gets called every time, even for a valid sub-reddit
            location.href = 'index.html';
        
    );

    fetchUrl = 'http://reddit.com/r/' + subreddit + '.json?jsonp=process_images&after=' + after;

    $.ajax(
        type: "GET",
        url: fetchUrl,
        dataType: "jsonp",
        cycleTime: 1,
        success: process_images
        // error: handle_error <- this doesn't work, because we're using jsonp
        // but if I take out jsonp, my whole app doesn't work any longer, since
        // I'm trying to run it as a local .html file, and cross-site scripting
        // security prevents it
    );


load_data(after);

这是来自服务器的响应。但我无法在 .ajax 方法中处理它:

GET http://www.reddit.com/r/%3Blk%3Blkl%3B.json?jsonp=process_images&after=&callback=jQuery1510605472848052159_1310668370375&_=1310668370433 404 (Not Found)

有什么想法吗?

我在这里尝试了一些建议,例如jQuery.getJSON doesn't trigger callback——但它每次都显示基本相同的错误,并带有一些随机数用于“未调用 jQuery#####”。

【问题讨论】:

【参考方案1】:

看this answer另一个问题。

本质上,这是 JQuery 中 jsonp 实现的一个限制。流行的答案是使用this js插件。

【讨论】:

【参考方案2】:

实际上这是跨域脚本注入的一个限制,这是 jQuery 用于 JSONP 的。

jquery-jsonp plugin 和更新版本的 jQuery 都通过实现超时来解决这个问题。他们仍然无法捕获错误。

如果可能,更好的解决方案是使用CORS (Cross-Origin Resource Sharing)。

较新版本的 jQuery 支持 CORS,但浏览器和远程站点也必须支持它。

所有主要桌面浏览器的当前版本都支持 CORS,Internet Explorer 仅从版本 10 开始。

【讨论】:

【参考方案3】:

如果需要,您可以在服务器响应中添加一些标头以允许跨域...

【讨论】:

您有示例链接吗? 这被称为 CORS,但它只有在远程站点支持时才有效。例如 YQL 支持它,但 Stack Exchange API 不支持。【参考方案4】:
$.ajax(
  statusCode: 
    404: function() 
      //handle the 404 here
      alert('page not found');
    
  
);

这里是参考:http://api.jquery.com/jQuery.ajax/

编辑

无法与 jsonp 一起使用,请参阅 ccurrens 的上述答案

【讨论】:

这不适用于 jsonp,因为 ccurrens 提供的链接指出 jsonp 不提供错误处理,因此 ccurrens 的答案中还提供了一些解决方法...

以上是关于当我使用 .ajax 和 JSONP 时,如何处理失败的 JSON 请求?的主要内容,如果未能解决你的问题,请参考以下文章

发生管道损坏时如何处理 AJAX 响应?

运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现

如何处理返回 PartialView 的 ajax 调用控制器操作中的模型状态错误

前端:如何处理AJAX请求的重复使用

将 Ajax 与 jQuery DataTables 一起使用时,如何确定如何处理返回的数据?

离开页面时如何处理jQuery ajax发布错误