我将网络应用移植到Android(已创建AppInventor AI2)以在WebViewer组件中运行。
我已经完成了大部分工作,但是我的web服务器上的API脚本的AJAX调用返回null。
我的猜测是服务器返回null,因为请求的来源是来自本地计算机(在开发期间)或移动设备上的独立网页的AJAX调用,而不是来自同一域上托管的页面
一些谷歌搜索引起了很多关于CORS的提及......
这是导致我问题的原因吗?
如果我直接从浏览器调用api URL(我的服务器上的PHP脚本返回XML),我会返回正确的数据。
我也有相同的代码作为Web应用程序的一部分运行,并且工作正常。
问题似乎只是在我从机器上的本地目录调用HTML和JavaScript文件时。 (所有其他JavaScript函数都正常工作,它只是那些使用AJAX调用从Web服务器获得空响应而导致我出现问题的人。
我已经尝试将JS文件上传到我的网络服务器并从html中调用它但是它也没有工作(这是一个很长的镜头,因为我猜AJAX调用实际上仍然来自本地html文件基本上)。
这是一个完整的设置,可用于测试......
包含JavaScript的HTML文件:
<html>
<head>
<title>Test BBP App AJAX Error</title>
<script>
function getDataViaAJAX(url, callback) {
var request = window.ActiveXObject ?
new ActiveXObject('Microsoft.XMLHTTP') :
new XMLHttpRequest;
request.onreadystatechange = function () {
if (request.readyState == 4) {
alert("ready state of ajax changed to 4");
alert("request/data responseText=" + request.responseText);
alert("request=" + request);
// request.onreadystatechange = doNothing;
callback(request, request.status);
}
};
request.open('GET', url, true);
request.send(null);
}
function doTheLocalTest() {
getDataViaAJAX("./sample.xml", function (data) {
var xml = data.responseXML;
alert("Response is: '"+xml+"'")
});
}
function doTheWebTest() {
getDataViaAJAX("http://www.bluebadgeparking.com/sample.xml", function (data) {
var xml = data.responseXML;
alert("Response is: '"+xml+"'")
});
}
</script>
</head>
<body>
<input type="button" value="Click To Get XML from a local file" onClick="doTheLocalTest();">
<br />
<input type="button" value="Click To Get XML from the web" onClick="doTheWebTest();">
</body>
</html>
示例XML内容(sample.xml):
<markers>
<marker id="1" descr="Whitefriars Street: One way street. Space on left." lat="51.5140241200000" lng="-0.1074814800000"/>
<marker id="1898" descr="Southern General Hospital, Surgical / Orthopaedic 1 Bay" lat="55.8635700800000" lng="-4.3390578030000"/>
</markers>
将它们保存到本地目录并尝试。
从本地文件中读取XML时,从我的Web服务器加载文件时,它会失败并返回空响应。
(顺便说一下,我假设如果我开发的FireFox插件可以通过我的网络服务器从AJAX中提取数据,我会遇到同样的问题 - 我最近一直在考虑的其他问题...)