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 或 iframe 元素的
allowCrossDomainXHR
特質 (此乃 AIR 所新增) 設定為
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 的子目錄,切勿對應到根目錄。即使該目錄不存在亦無妨。例如,若將上述 iframe 改為如下所示,對 www.example.com 發出要求時便會從遠端伺服器載入,而非從應用程式目錄載入:
<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 安全性
。