我是应用开发的新手。我正在使用英特尔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();
}
答案 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。