检测到407错误并持续存在所有后续请求

时间:2011-07-11 11:01:25

标签: ajax json jquery jsonp

我有一个简单的javascript,它使用来自JQuery的$ .ajax(),非常适合GET / POST。但是,对于代理背后的某些用户,他们会收到407错误,如下面的帖子所述。

407 Proxy Authentication Required

现在,正如您将看到的,我已更新该帖子,声明 JSONP 的使用将足以作为解决方法。我现在所处的位置是,我不想一直使用JSONP,只有在需要时才使用JSONP。

 function original() {
     $.ajax({
         url: "http://somecool.url/foo",
         data: { id:"bar"},
         statusCode: {
             407: foo()
         },
         success: function(data) {
             $.each(data, function(k,v) {
                 $('#foo').append("<li>" + k + ":" + v + "</li>");
             });
         }
     });
 }    


 function foo() {
     $.ajax({
         url: "http://somecool.url/foo",
         data: { id:"bar" },
         dataType: "jsonp",
         success: function(data) {
             $.each(data, function(k,v) {
                 $('#foo').append("<li>" + k + ":" + v + "</li>");
             });
         }
     });
 }

 $(document).ready(function() {
     original();
 });

是否可以保留第一次失败的状态,当发生代理问题时返回407错误,以便所有后续请求都不会转到original()函数并转到{{1}功能?

1 个答案:

答案 0 :(得分:1)

我的原始答案(下面)是处理函数名称覆盖以适应您问题中的代码。但是,有一个更好的解决方案,因为毕竟您只想将所有请求切换到JSONP,当且仅当您收到407响应代码时。

$.ajaxSetup()旨在实现这一目标:

function original() {
    $.ajax({
        url: "http://somecool.url/foo",
        data: { id:"bar"},
        statusCode: {
             407: function() {
                 $.ajaxSetup({ dataType: "jsonp" });
                 // Now all AJAX requests use JSONP, retry.
                 original();
             }
        },
        success: function(data) {
            $.each(data, function(k,v) {
                $('#foo').append("<li>" + k + ":" + v + "</li>");
            });
        }
    });
}

使用此策略,一旦收到407,所有未来的AJAX请求都将使用JSONP。



为了历史,这是我原来的答案。

第一次收到original回复代码时,您可以永久更改407中存储的功能:

function original() {
    $.ajax({
        url: "http://somecool.url/foo",
        data: { id:"bar"},
        statusCode: {
             407: function() {
                 window.original = foo;
                 foo();
             }
        },
        success: function(data) {
            $.each(data, function(k,v) {
                $('#foo').append("<li>" + k + ":" + v + "</li>");
            });
        }
    });
}

从那时起,名称original将引用foo()。您甚至可以更改功能并同时调用其替换:

407: function() {
    (window.original = foo)();
}