AIR 提供了应用程序可用于执行数据请求的 XMLHttpRequest (XHR) 对象。下面的示例演示简单数据请求:
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "http:/www.example.com/file.data", true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
//do something with data...
}
}
xmlhttp.send(null);
与浏览器不同,AIR 允许在应用程序沙箱中运行的内容请求任何域中的数据。对于包含 JSON 字符串的 XHR 结果,除非该结果还包含可执行代码,否则可以计算出该结果的数据对象。如果 XHR 结果中存在可执行语句,则会引发错误,且计算尝试失败。
若要防止从远程源意外注入代码,在完成加载页之前执行同步 XHR 时将返回空结果。异步 XHR 将始终在加载页之后返回。
默认情况下,AIR 阻止在非应用程序沙箱中执行跨域 XMLHttpRequest。应用程序沙箱中的父窗口可以选择在包含非应用程序沙箱内容的子 frame 中允许跨域请求,方法是在包含非应用程序沙箱内容的 frame 或 iframe 元素中将 AIR 添加的
allowCrossDomainXHR
属性设置为
true
:
<iframe id="mashup"
src="http://www.example.com/map.html"
allowCrossDomainXHR="true"
</iframe>
注:
还可以根据需要使用 AIR URLStream 类下载数据。
如果从包含已映射到远程沙箱的应用程序内容的 frame 或 iframe 对远程服务器调度 XMLHttpRequest,请确保映射 URL 不会遮蔽在 XHR 中使用的服务器地址。例如,请考虑以下 iframe 定义,该定义将应用程序内容映射到 example.com 域所对应的远程沙箱:
<iframe id="mashup"
src="http://www.example.com/map.html"
documentRoot="app:/sandbox/"
sandboxRoot="http://www.example.com/"
allowCrossDomainXHR="true"
</iframe>
由于
sandboxRoot
属性重新映射 www.example.com 地址的根 URL,因此所有请求都将从应用程序目录加载,而不是从远程服务器加载。无论请求是派生自页导航还是 XMLHttpRequest,都将重新映射这些请求。
若要避免意外阻止对远程服务器的数据请求,请将
sandboxRoot
映射到远程 URL 的子目录,而不是根目录。该目录不一定存在。例如,若要允许从远程服务器加载对 www.example.com 的请求,而不是从应用程序目录加载,请将上面的 iframe 更改为以下内容:
<iframe id="mashup"
src="http://www.example.com/map.html"
documentRoot="app:/sandbox/"
sandboxRoot="http://www.example.com/air/"
allowCrossDomainXHR="true"
</iframe>
在本例中,仅在本地加载
air
子目录中的内容。
有关沙箱映射的详细信息,请参阅
HTML frame 和 iframe 元素
以及
Adobe AIR 中的 HTML 安全性
。