外部データのロードFlash Player 9 以降、Adobe AIR 1.0 以降 ActionScript 3.0 には、外部ソースからデータをロードするメカニズムが含まれます。 外部ソースは、テキストファイルなどの静的コンテンツや、Web スクリプトによって生成される動的コンテンツを提供します。データは様々な形式で書式設定されている可能性があります。そのため、ActionScript には、データのデコードおよびデータへのアクセスのための機能が用意されています。また、データを取得する際に、外部サーバーにデータを送信することもできます。 URLRequest クラスの使用外部データをロードする API の多くは、URLRequest クラスを使用して必要なネットワーク要求のプロパティを定義します。 URLRequest プロパティ次の URLRequest オブジェクトのプロパティは、任意のセキュリティサンドボックス内で設定できます。
AIR には、URLRequest クラスで設定できる追加のプロパティが用意されています。これらのプロパティは、アプリケーションセキュリティサンドボックス内で実行されている AIR コンテンツに対してのみ使用できます。アプリケーションサンドボックスのコンテンツでは、(file や http などの標準スキームに加えて)新しい URL スキームを使用して URL を定義することもできます。
注意: HTMLLoader クラスには、HTMLLoader オブジェクトによって読み込まれたコンテンツの設定に関連するプロパティがあります。詳しくは、HTMLLoader クラスについてを参照してください。
URLRequest のデフォルトの設定(AIR のみ)URLRequestDefaults クラスを使用すると、URLRequest オブジェクトに対して、アプリケーション固有のデフォルト設定を定義できます。例えば、次のコードでは、manageCookies プロパティおよび useCache プロパティのデフォルト値を設定しています。新たに作成されるすべての URLRequest オブジェクトでは、標準のデフォルト値ではなく、指定した値がこれらのプロパティで使用されます。 URLRequestDefaults.manageCookies = false; URLRequestDefaults.useCache = false; 注意: URLRequestDefaults クラスは、Adobe AIR で実行されているコンテンツに対してのみ定義されます。Flash Player ではサポートされていません。
URLRequestDefaults クラスには、setLoginCredentialsForHost() メソッドが含まれています。このメソッドを使用すると、特定のホストに対して使用するデフォルトのユーザー名とパスワードを指定できます。ホストは、このメソッドの hostname パラメーターで指定します。ホストには、ドメイン("www.example.com" など)またはドメインとポート番号("www.example.com:80" など)を指定できます。"example.com"、"www.example.com"、および "sales.example.com" は、それぞれ固有のホストと見なされることに注意してください。 これらの資格情報は、サーバーから要求された場合にのみ使用されます。ユーザーがすでに認証されている場合(認証ダイアログボックスを使用した場合など)は、setLoginCredentialsForHost() メソッドを呼び出しても、認証されたユーザーが変更されることはありません。 次のコードでは、www.example.com に対して送信する要求で使用する、デフォルトのユーザー名とパスワードを設定します。 URLRequestDefaults.setLoginCredentialsForHost("www.example.com", "Ada", "love1816$X"); URLRequestDefaults の設定は、現在のアプリケーションドメインのみに適用されます。ただし、例外的に、setLoginCredentialsForHost() メソッドに渡される資格情報は、AIR アプリケーション内で、任意のアプリケーションドメインで実行された要求に対して使用されます。 詳しくは、『Adobe Flash Platform 用 ActionScript 3.0 リファレンスガイド』の URLRequestDefaults クラスの項を参照してください。 URI スキーム標準の URI スキーム(以下参照)は、任意のセキュリティサンドボックスから実行された要求で使用できます。 file:ローカルファイルシステムに保存されているファイルの URL を指定するには、file: を使用します。例えば、次のような場合です。 file:///c:/AIR Test/test.txt AIR では、アプリケーションセキュリティサンドボックス内で実行されているコンテンツの URL を定義する際には、次のスキームを使用することもできます。 app:app: は、インストールされたアプリケーションのルートディレクトリを基準とした相対的なパスを指定する場合に使用します。例えば、次のパスは、インストールされているアプリケーションのディレクトリの resources サブディレクトリを参照しています。 app:/resources AIR Debug Launcher(ADL)を使用して AIR アプリケーションを起動する場合、アプリケーションディレクトリはアプリケーション記述ファイルが含まれているディレクトリです。 app-storage:app-storage: は、アプリケーションのデータ記憶領域ディレクトリを基準とした相対的なパスを指定する場合に使用します。AIR では、インストールされたアプリケーション(およびユーザー)ごとに、一意のアプリケーション記憶領域ディレクトリが作成されます。このディレクトリは、そのアプリケーション固有のデータを格納するための便利な場所として使用できます。例えば、次のパスは、アプリケーション記憶領域ディレクトリの settings サブディレクトリにある prefs.xml ファイルを参照しています。 app-storage:/settings/prefs.xml アプリケーション記憶領域ディレクトリの場所は、ユーザー名、アプリケーション ID および発行者 ID に基づきます(該当する場合)。
注意: AIR 1.5.3 の時点では、すべての AIR アプリケーションに発行者 ID が付いているわけではありません。
File.applicationStorageDirectory メソッドで作成した File オブジェクトの URL(および url プロパティ)では、次のように app-storage URI スキームを使用します。 var dir:File = File.applicationStorageDirectory; dir = dir.resolvePath("preferences"); trace(dir.url); // app-storage:/preferences mailto:mailto スキームは、navigateToURL() 関数に渡される URLRequest オブジェクトで使用できます。別のアプリケーションで URL を開くを参照してください。 前述の URI スキームを使用する URLRequest オブジェクトを使用すると、多数の異なるオブジェクト(FileStream オブジェクトや Sound オブジェクトなど)に対する URL 要求を定義できます。また、これらのスキームは、AIR 内で実行されている HTML コンテンツ(img タグの src 属性など)で使用することもできます。 ただし、AIR 固有の URI スキーム(app: および app-storage:)は、アプリケーションセキュリティサンドボックス内のコンテンツでしか使用できません。詳しくは、AIR のセキュリティを参照してください。 使用できない URI スキーム(AIR)一部の API では、Web ブラウザーでコンテンツを起動することができます。これらの API を AIR で使用する場合、セキュリティ上の理由のため、一部の URI スキームの使用が禁止されています。使用できないスキームは、API を使用するコードのセキュリティサンドボックスに応じて異なります。詳しくは、別のアプリケーションで URL を開くを参照してください。 URL 変数の設定変数は URL ストリングに直接追加できますが、URLVariables クラスを使用して要求に必要な変数を定義する方が簡単な場合があります。 URLVariables オブジェクトにパラメーターを追加するには、3 つの方法があります。
次の例は、3 つのメソッドすべてと、URLRequest オブジェクトに変数を割り当てる方法を示しています。 var urlVar:URLVariables = new URLVariables( "one=1&two=2" ); urlVar.decode("amp=" + encodeURIComponent( "&" ) ); urlVar.three = 3; urlVar.amp2 = "&&"; trace(urlVar.toString()); //amp=%26&2=%26%26&one=1&two=2&three=3 var urlRequest:URLRequest = new URLRequest( "http://www.example.com/test.cfm" ); urlRequest.data = urlVar; URLVariables コンストラクターまたは URLVariables.decode() メソッドで変数を定義する場合は必ず、URI ストリング内の特別な意味を持つ文字を URL エンコードしてください。例えば、パラメーター名またはパラメーター値でアンパサンドを使用する場合、アンパサンドはパラメーターの区切り文字として機能するので、& を %26 に変更してアンパサンドをエンコードする必要があります。これには、トップレベルの encodeURIComponent() 関数を使用できます。 URLLoader クラスの使用URLLoader クラスを使用すると、サーバーに要求を送信したり、返された情報にアクセスしたりできます。ローカルファイルへのアクセスが許可されているコンテキストで、ローカルファイルシステム上のファイルにアクセスする場合にも、URLLoader クラスを使用できます。URLLoader クラスは、指定した URL からテキスト、バイナリデータ、または URL エンコード形式の変数をダウンロードする際に使用します。URLLoader クラスは、complete、httpStatus、ioError、open、progress、securityError などのイベントを送出します。 ActionScript 3.0 イベント処理モデルは、LoadVars.onData、LoadVars.onHTTPStatus および LoadVars.onLoad の各イベントハンドラーを使用していた ActionScript 2.0 モデルとは大きく異なります。ActionScript 3.0 でのイベント処理について詳しくは、イベント処理を参照してください。 ダウンロードデータは、ダウンロードが完了するまで使用できません。ダウンロードの進捗状況(ロード済みバイト数と合計バイト数)は、progress イベントの送出をリッスンすることで監視できます。ただし、ファイルのロードの完了が早すぎると progress イベントは送出されない場合があります。ファイルが正常にダウンロードされた場合、complete イベントが送出されます。URLLoader の dataFormat プロパティを設定することにより、データをテキスト、生のバイナリデータまたは URLVariables オブジェクト形式で受信できます。 URLLoader.load() メソッドのパラメーターは、URLRequest オブジェクトを指定する request パラメーターの 1 つだけです(URLLoader クラスのコンストラクターにも、必要に応じて同じパラメーターを指定できます)。URLRequest インスタンスには、1 件の HTTP 要求に関して、ターゲット URL、要求メソッド(GET または POST)、付加的なヘッダー情報、MIME タイプおよびその他すべての情報が格納されます。 例えば、XML パケットをサーバーサイドスクリプトにアップロードする場合のコードは次のようになります。 var secondsUTC:Number = new Date().time; var dataXML:XML = <clock> <time>{secondsUTC}</time> </clock>; var request:URLRequest = new URLRequest("http://www.yourdomain.com/time.cfm"); request.contentType = "text/xml"; request.data = dataXML.toXMLString(); request.method = URLRequestMethod.POST; var loader:URLLoader = new URLLoader(); loader.load(request); 上記のコードスニペットでは、サーバーに送信される XML パケットを格納する dataXML という名前の XML ドキュメントを作成します。この例では、URLRequest の contentType プロパティを "text/xml" に設定し、XML ドキュメントを URLRequest の data プロパティに割り当てます。最後に、URLLoader オブジェクトを作成し、load() メソッドを使用してリモートスクリプトに要求を送信します。 URLStream クラスの使用URLStream クラスを使用すると、データを受信している最中にダウンロードデータにアクセスできます。URLStream クラスでは、ダウンロードの完了前にストリームを閉じることもできます。ダウンロードされたデータは、生のバイナリデータ形式で利用できます。 URLStream オブジェクトからデータを読み込むときは、bytesAvailable プロパティを使用して、読み取るデータが十分にあるかどうかを事前に確認します。読み取り可能なデータ量よりも多くのデータを読み取ろうとすると、EOFError 例外がスローされます。 httpResponseStatus イベント(AIR)Adobe AIR では、httpStatus イベントに加えて httpResponseStatus イベントが URLStream クラスから送出されます。httpResponseStatus イベントは、応答データの前に送出されます。HTTPStatusEvent クラスで表わされる httpResponseStatus イベントには、応答を返した URL を示す responseURL プロパティと、応答によって返された応答ヘッダーを表す URLRequestHeader オブジェクトの配列である responseHeaders プロパティが含まれています。 外部ドキュメントからのデータのロード動的なアプリケーションを作成する場合、外部のファイルまたはサーバーサイドスクリプトからデータをロードするようにすると、アプリケーションの編集と再コンパイルを必要としない動的なアプリケーションを実現できます。例えば、「今日の一言」アプリケーションを作成する場合、サーバーサイドスクリプトで、データベースからランダムに選んだ一言を取得して 1 日 1 回テキストファイルに保存するようにします。そうすれば、 アプリケーションでは静的なテキストファイルをロードするだけでよく、毎回データベースへのクエリを発行する必要はなくなります。 次のコードでは、URLRequest オブジェクトと URLLoader オブジェクトを作成し、それによって "params.txt" という外部のテキストファイルから内容をロードします。 var request:URLRequest = new URLRequest("params.txt"); var loader:URLLoader = new URLLoader(); loader.load(request); デフォルトでは、要求メソッドを定義しない場合、Flash Player および Adobe AIR では HTTP GET メソッドを使用してコンテンツがロードされます。POST メソッドで要求を送信する場合は、次のように、静的定数 URLRequestMethod.POST を使用して request.method プロパティに POST を設定します。
var request:URLRequest = new URLRequest("sendfeedback.cfm"); request.method = URLRequestMethod.POST; 実行時に読み込まれる外部ドキュメント params.txt の内容は次のようなデータです。 monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday このファイルには、monthNames および dayNames の 2 つのパラメーターが含まれています。各パラメーターの内容は、ストリングとして解析されるカンマ区切りリストです。このリストは String.split() メソッドを使用して分割し、配列に変換できます。 ![]() データの読み込みが完了すると complete イベントが送出され、次のように、URLLoader の data プロパティで外部ドキュメントのコンテンツを使用できるようになります。
function completeHandler(event) { var loader2 = event.target; air.trace(loader2.data); } リモートドキュメントに名前と値のペアが格納されている場合は、URLVariables クラスを使用し、読み込んだファイルのコンテンツを次のように渡すことでデータを解析できます。 private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); var variables:URLVariables = new URLVariables(loader2.data); trace(variables.dayNames); } 外部ファイルから読み込んだ個々の名前/値ペアから、URLVariables オブジェクトの個別のプロパティが作成されます。このコード例にある variables オブジェクトの各プロパティは、ストリングとして扱われます。名前/値ペアの値がアイテムのリストである場合は、次のように String.split() メソッドを呼び出すことでストリングから配列に変換できます。 var dayNameArray:Array = variables.dayNames.split(","); ![]() リモートファイルの内容を文字列としてロードして新しい URLVariables オブジェクトを作成する方法とは別に、URLLoader.dataFormat プロパティを URLLoaderDataFormat クラスの静的プロパティのいずれかに設定する方法もあります。URLLoader.dataFormat プロパティに設定できる値は次の 3 つのうちいずれかです。
次のコードでは URLLoader.dataFormat プロパティを URLLoaderDataFormat.VARIABLES に設定しているので、ロードしたデータは自動的に解析されて URLVariables オブジェクトが作成されます。 package { import flash.display.Sprite; import flash.events.*; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; public class URLLoaderDataFormatExample extends Sprite { public function URLLoaderDataFormatExample() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt"); var variables:URLLoader = new URLLoader(); variables.dataFormat = URLLoaderDataFormat.VARIABLES; variables.addEventListener(Event.COMPLETE, completeHandler); try { variables.load(request); } catch (error:Error) { trace("Unable to load URL: " + error); } } private function completeHandler(event:Event):void { var loader:URLLoader = URLLoader(event.target); trace(loader.data.dayNames); } } } 注意: URLLoader.dataFormat のデフォルト値は URLLoaderDataFormat.TEXT です。
次の例に示すように、外部ファイルから XML を読み込む方法も、URLVariables を読み込む場合と同じです。URLRequest インスタンスと URLLoader インスタンスを作成し、それらを使用してリモート XML ドキュメントをダウンロードします。ファイルのダウンロードが完了すると、Event.COMPLETE イベントが送出され、外部ファイルの内容は XML インスタンスに変換されます。このインスタンスは XML のメソッドとプロパティを使用して解析できます。 package { import flash.display.Sprite; import flash.errors.*; import flash.events.*; import flash.net.URLLoader; import flash.net.URLRequest; public class ExternalDocs extends Sprite { public function ExternalDocs() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml"); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); } } private function completeHandler(event:Event):void { var dataXML:XML = XML(event.target.data); trace(dataXML.toXMLString()); } } } 外部スクリプトとの通信URLVariables クラスを使用すると、外部データファイルからデータをロードできるだけでなく、サーバーサイドスクリプトに変数を送信し、サーバーの応答を処理することもできます。例えば、ゲームを作成する場合、ユーザーの得点をサーバーに送信して高得点者リストに掲載できるかどうか確認することや、ユーザーのログイン情報をサーバーに送信して検証することなどが考えられます。サーバーサイドスクリプトでは、ユーザー名とパスワードを処理してデータベースに照会し、入力されたユーザー資格情報が有効かどうかの確認を応答として返します。 次のコードでは、variables という URLVariables オブジェクトを作成し、このオブジェクトを使用して name という新しい変数を作成しています。次に、変数の送信先となるサーバーサイドスクリプトの URL を指定する URLRequest オブジェクトを作成します。その後、URLRequest オブジェクトの method プロパティに、HTTP POST 要求で変数を送信するように設定します。URL 要求に URLVariables オブジェクトを追加するには、前の例で作成した URLVariables オブジェクトを URLRequest オブジェクトの data プロパティに設定します。最後に、URLLoader インスタンスを作成し、URLLoader.load() メソッドを呼び出して要求を送信します。 var variables:URLVariables = new URLVariables("name=Franklin"); var request:URLRequest = new URLRequest(); request.url = "http://www.[yourdomain].com/greeting.cfm"; request.method = URLRequestMethod.POST; request.data = variables; var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:Error) { trace("Unable to load URL"); } function completeHandler(event:Event):void { trace(event.target.data.welcomeMessage); } 次のコードには、前の例で使用された ColdFusion® greeting.cfm ドキュメントのコンテンツが含まれています。 <cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> <cfset Form.Name = "Stranger" /> </cfif> <cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# </cfoutput> |
![]() |