服务器返回重定向(302)后,iOS设备上的AJAX或XHR请求失败,代码为0
AJAX or XHR request on iOS device failed with code 0 after server returns redirect (302)
我正在开发一个移动应用程序,它是用Cordova(PhoneGap)开发的。我的基本代码是用JavaScript编写的,它被编译成原生Android和iOS代码。在我的一个加载XML的请求中,我向UrlA发送了一个请求,服务器将该请求重定向(状态302)到UrlB。然后从UrlB返回一个带有XML的响应。
所有这些过程在安卓设备上(以及桌面上)都很有效。
但在iOS设备上,由于某种原因,对UrlA的请求失败,代码为0。
我试图将我的请求表单jQuery的Ajax更改为带有XHR对象的纯JS解决方案。但结果是一样的。
原始Ajax请求(仅适用于Android)
$.ajax(
{
type: "GET",
url: xmlUrl,
dataType: "xml",
crossDomain: true,
async: true,
timeout: 7000, // 7sec before timeout failure
beforeSend: function(xhr)
{
//xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.8,he;q=0.6");
xhr.setRequestHeader("Accept-Encoding", "gzip, deflate, sdch");
},
// Request succeed
success: successCallback,
// Request failed
error: errorCallback
}
我的第二次尝试,使用XHR请求(仅适用于Android)
var XHR = new XMLHttpRequest();
if (XHR)
{
var method = 'GET';
var isAsync = true;
XHR.onreadystatechange = function()
{
switch (XHR.readyState)
{
case 0:
console.log("# XHR: State 0 - Request isn't initialized");
break;
case 1:
console.log("# XHR: State 1 - Request was set up");
break;
case 2:
console.log("# XHR: State 2 - Request was sent");
break;
case 3:
console.log("# XHR: State 3 - Request in progress");
break;
case 4:
console.log("# XHR: State 4 - Request is completed");
if (XHR.status == 200) // OK
{
console.log("# XHR: Request Success!");
console.log(XHR);
var responseText = XHR.responseText;
var responseXml = XHR.responseXML;
successCallback(responseXml)
}
else // request failed
{
console.warn("# XHR: Request Failed!");
console.log(XHR);
failerCallback("# XHR: Request failed! [Status: " + XHR.status + "]");
}
break;
default:
console.log("# XHR: Unknown ReadyState [" + XHR.readyState + "]");
break;
}
};
XHR.open(method, xmlUrl, isAsync);
XHR.send(); // Start request
}
else
{
failerCallback("XHR isn't defined");
}
我还注意到,在Android设备上,当使用XHR对象运行代码时,我们会得到所有readyState(1到4,一个在外)但在iOS设备上,我们只能获得readyState 1和readyState4,但状态代码为0。
替换
if (XHR.status == 200) // OK
带有
if ((XHR.status >= 200 && XHR.status < 300) ||
(XHR.status === 0 && !!XHR.responseXML))
相关文章:
- 使用xhr.onprogress可以在不耗尽内存的情况下处理大型ajax下载
- 为什么我在 JavaScript/AJAX 中的 xhr.onreadystatechange() 中的 “form.s
- 需要帮助编写等效于 XHR 请求的 Jquery $.ajax 请求
- 减慢 ajax 调用/xhr 请求的最佳方法
- 405 AJAX 调用 JSON 时出错(xhr.status)
- ajax 正在用多个调用覆盖 XHR 对象 - jQuery
- 如果应用程序具有 XHR 调用,其中应用程序/json 作为“类型”,是否意味着它是 AJAX
- XHR(Ajax)发送原型奇怪的行为
- rails应用程序中的AJAX请求错误:xhr.send((options.hasContent&&op
- 服务器返回重定向(302)后,iOS设备上的AJAX或XHR请求失败,代码为0
- 如何在使用Backbone'进行AJAX请求时访问XHR对象;s Fetch()
- js-ajax代码没有'工作不正常.第一个是在连接的两个xhr函数中不显示
- 是否有可能使用HTML拖放文件上传,但没有AJAX / XHR
- 美元.用ajax克隆XHR请求中断事件
- JQuery ajax xhr 100%完成前开始
- 美元.Ajax到dojo.用于sharepoint web服务的XHR无法工作
- 同步XHR (AJAX)已弃用
- 如何修复jquery中的ajax xhr错误
- 使用jQuery会产生不同的结果.过滤器和jQuery.查找Ajax xhr响应
- AJAX XHR-Call创建无效参数异常