服务器返回重定向 (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 编写的,它编译成原生 androidios 代码。 在我的一个加载 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的主要内容,如果未能解决你的问题,请参考以下文章

浏览器302重定向传递hash

301重定向与302跳转有什么区别?

无法在 ajax 中处理 302 重定向,为啥? [复制]

302 在 CORS 预检请求到 nodejs 服务器后重定向

Java 中的 URL 重定向返回 302 而不是 301

反向代理模式 Apache 拦截或捕获来自后端服务器的 302 响应并在内部重定向而不将 302 响应发送回客户端