为什么我不能使用英特尔XDK应用程序将我的Android设备连接到localhost?

时间:2014-05-18 17:18:44

标签: android intel-xdk

我是应用开发的新手。我正在使用英特尔XDK制作Android应用程序。

该应用程序通过连接到使用Symfony完成的后端中的数据库来工作,并且在模拟器中表现良好。我想现在通过WiFi使用我的PC作为localhost从真实设备进行测试。我读到你必须使用ipconfig检索本地主机IP地址,然后使用该IP进行连接。但是,当我测试应用程序时,它无法连接。奇怪的是,如果我使用具有相同URL的移动浏览器,则连接有效:我可以看到用于获取数据库信息的XML文件。

应用中的连接代码:

xmlhttp=new XMLHttpRequest();            
xmlhttp.onerror=transferFailed;
xmlhttp.open("GET","http://192.xxx.x.x/symfony/web/app_dev.php/api/v1/reportes/reportes.xml",false);

onerror功能:

function transferFailed(e) {
  alert("Error al conectar:"+e.target.status);
}

正如我所说,连接不起作用,我收到警告消息:“错误al conectar:0”

如果我将地址http://192.xxx.x.x/symfony/web/app_dev.php/api/v1/reportes/reportes.xml放在移动浏览器中,我会得到正确的XML文件。

编辑:好吧,问题似乎是sycnhronus请求。后来我不得不解析响应xml。我不知道为什么在模拟器和我在phonegap中制作的应用程序前一段时间它没有解析。代码:

function mapIni() {


        xmlhttp=new XMLHttpRequest();            
        xmlhttp.onerror=transferFailed;
        xmlhttp.open("GET","http://localhost/symfony/web//app_dev.php/api/v1/reportes/reporte.xml",true);

        xmlhttp.onload= function (event) {
        alert("onload:"+xmlhttp.response);
        };

        xmlhttp.onreadystatechange = function() {

        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {


             xmlDoc=xmlhttp.responseXML; 
             xmlDoc=xmlhttp.responseXML; 
             xmlDoc = new DOMParser().parseFromString(xmlhttp.responseText,'text/xml');

             x=xmlDoc.getElementsByTagName("entry");


            alert("x[0]:"+x[0].getElementsByTagName("tipo")[0].childNodes[0].nodeValue);
        }
      }
      xmlhttp.send();
}   

3 个答案:

答案 0 :(得分:0)

由于Cross-Origin请求,它可能会失败,添加此脚本标记:<script src="xhr.js></script>"并尝试设备。您不需要实际的xhr.js文件,只需在index.html中添加脚本标记,英特尔XDK版本将包含它以解决跨源策略。

答案 1 :(得分:0)

我可以看到两个可能的问题。如果您期望其余的javascript运行时在网络请求执行时响应,则同步使用XHR通常是一个问题。 我会首先尝试异步请求(无论如何都应该首选):

xmlhttp.open("GET","...",true);

您可能必须在打开请求后发送请求(对于非GET请求肯定是这样,但GET可能无法发送,但我很怀疑)

xmlhttp=new XMLHttpRequest();            
xmlhttp.onerror=transferFailed;
xmlhttp.open("GET","...",true);
xmlhttp.send();

最后,大概你有一些处理程序附加到onload事件,当它对你有用时:)

xmlhttp.addEventListener('onload', function (event) {
  console.log(xmlhttp.response);
});

答案 2 :(得分:0)

此外,虽然模拟器位于同一台计算机上并识别localhost,但您的实际Android设备无法解释localhost的位置。对于设备构建,将localhost更改为服务器名称,在Windows下更改首次安装Windows时分配的计算机名称,并通过浏览器进行测试,确保您可以通过计算机名称访问文件。验证后,将localhost更改为您的计算机名称。您还必须确保允许并启用CORS。