我有一个简单的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}功能?
答案 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)();
}