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 クラスを使用してデータをダウンロードすることもできます。
リモートサンドボックスにマップされているアプリケーションコンテンツを含むフレームまたはインラインフレームからリモートサーバーに XMLHttpRequest を送出する場合は、マッピング URL で、XHR で使用するサーバーアドレスをマスクしていないことを確認してください。例えば、example.com ドメインのリモートサンドボックスにアプリケーションコンテンツをマップする、次の iframe 定義について考えます。
<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 セキュリティ
を参照してください。