【问题标题】:PhoneGap + jQuery android app; ajax request runs in browser but not on phone or emulatorPhoneGap + jQuery 安卓应用; ajax 请求在浏览器中运行,但不在手机或模拟器上
【发布时间】:2013-04-19 16:56:29
【问题描述】:

我正在开发一个必须从 Microsoft Dynamics NAV SOAP Web 服务加载数据的应用程序。当我在浏览器(IE9 或 Chrome v 26.0...)中运行代码时,代码会执行应有的操作。但是当我在 android 模拟器或真实设备(htc 感觉)上测试代码时,ajax 调用失败并且我得到 XMLHttpRequest 错误 0。

但是,我也可以从不同的 web 服务加载数据,而无需在 android 系统上进行基本身份验证。

我的白名单(位于 res/xml/config.xml)如下所示:

<access origin="*" />

<plugins>
    ... // all other possible plugins
    <plugin name="NetworkStatus" value="org.apache.cordova.NetworkManager"/>
</plugins>

这里是代码:

function readTimeRecords(callback) {

var wsUrl = 'http://.../WS/CRONUS%20AG/Page/Time_Recording';

var soapMessage = '<?xml version="1.0" encoding="utf-8"?>' + 
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">' + 
    '<soap:Body>' + 
        '<ReadMultiple xmlns="urn:microsoft-dynamics-schemas/page/time_recording" >' +
            '<filter>' +
                '<Field>No</Field>' +
            '</filter>' +
            '<bookmarkKey />' +
            '<setSize>' +
                '5' +
            '</setSize>' +
        '</ReadMultiple>' +
     '</soap:Body> ' + 
 '</soap:Envelope>';

// enable cross site requests in IE
$.support.cors = true;
$.mobile.allowCrossDomainPages = true;

$.ajax({
    url : wsUrl,
    type : "POST",
    dataType : "text",
    data : soapMessage,
    processData : false,
    contentType : "text/xml", 

    password : "passwd",
    username : "domain\\user",

    beforeSend : function(xhr) {
        xhr.setRequestHeader('SOAPAction', 'urn:microsoft-dynamics-schemas/page/time_recording');
    },
    success : function(msg) {
        ...     
        callback(record);
    },
    error : onError 
})  
}

function onError(XMLHttpRequest, textStatus, errorThrown) { 
    debugger;
    console.log("error: " + textStatus + ", errorThrown: " + errorThrown);
        // i just get the message error: error:
}

有人知道如何解决这个问题吗?

使用的设置: jquery.mobile-1.3.0 jQuery-19.1 科尔多瓦-2.5

【问题讨论】:

  • @user2289828 你能解决这个问题吗?

标签: android jquery cordova soap basic-authentication


【解决方案1】:

要使 CORS 正常工作,您的 Web 服务必须启用 CORS。这是good writeup。如果您无法使用 CORS 启用您的服务,则另一种选择是使用 JSONP 而不是 JSON。

【讨论】:

  • 如果我错了,请纠正我,但我认为同源策略只影响浏览器而不影响移动设备上的应用程序。因此我不必使用 CORS。但是,我可以在 IE 和 Chrome (--disable-web-security) 中执行代码并且它运行良好。此外,我不能使用 JSON 或 JSONP,因为soap Web 服务只提供 XML 格式的数据。
  • 没错...移动应用程序可以进行跨域调用。如果您在模拟器中将应用程序作为网站运行,则需要启用 CORS 服务。你能看到使用 XMLHttpRequest.status 和 XMLHttpRequest.statusText 返回的状态码和错误是什么
  • status = 0 statusText = "error" 好的,所以您是说 phonegap 应用程序比原生应用程序更像网页,我需要使用 CORS 才能运行 Web 服务?
  • 不。你最初的假设是正确的。我的意思是,如果您使用 IIS 等 Web 服务器托管应用程序,然后使用模拟器浏览器访问它,则需要 CORS。如果您在模拟器中安装 .apk 文件并运行它,那么您不必 CORS 启用该服务。
  • 好的,感谢您向我澄清这一点。出于测试目的,我总是安装 .apk 文件。所以问题不应该是跨源请求。我无法想象是什么导致了错误。我什至检查了 Web 服务目标 URL 是否可访问。我将不胜感激找到错误的任何建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多