服务器返回重定向 (302) 后,iOS 设备上的 AJAX 或 XHR 请求失败,代码为 0
Posted
技术标签:
【中文标题】服务器返回重定向 (302) 后,iOS 设备上的 AJAX 或 XHR 请求失败,代码为 0【英文标题】:AJAX or XHR request on iOS device failed with code 0 after server returns redirect (302) 【发布时间】:2016-03-16 01:51:03 【问题描述】:我正在开发一个使用 Cordova (PhoneGap) 开发的移动应用程序。 我的基本代码是用 javascript 编写的,它编译成原生 android 和 ios 代码。 在我的一个加载 XML 的请求中,我向 UrlA 发送了一个请求,服务器将请求 重定向(状态 302) 到 UrlB。然后从 UrlB 返回带有 XML 的响应。
所有这些过程都可以在 Android 设备(和桌面)上正常运行。
但在 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 和 readyState 4,但 statusCode 为 0。
【问题讨论】:
我也有同样的问题。任何人都有解决方案 【参考方案1】:替换
if (XHR.status == 200) // OK
与
if ((XHR.status >= 200 && XHR.status < 300) ||
(XHR.status === 0 && !!XHR.responseXML))
【讨论】:
以上是关于服务器返回重定向 (302) 后,iOS 设备上的 AJAX 或 XHR 请求失败,代码为 0的主要内容,如果未能解决你的问题,请参考以下文章