外部データの操作

大規模な ActionScript アプリケーションを作成する場合、サーバーサイドスクリプトとの通信や、外部の XML またはテキストファイルのロードが必要になることがよくあります。これに関する動作は ActionScript 2.0 と ActionScript 3.0 では大きく異なります。ActionScript の以前のバージョンでは、リモートのテキストファイルをロードする際に LoadVars クラスと LoadVars.onData() イベントハンドラを使用しました。ActionScript 3.0 では、外部ファイルをロードするには URLLoader クラスと URLRequest クラスを使用します。リモートコンテンツが名前/値のペアの形式になっている場合は、URLVariables クラスを使用してサーバーの結果を解析できます。

リモート XML ドキュメントをロードするには、URLLoader および URLRequest クラスを使用します。その後、XML クラスのコンストラクタ、XMLDocument クラスのコンストラクタ、または XMLDocument.parseXML() メソッドを使用して XML ドキュメントを解析できます。これにより、URLVariables クラスと XML クラスのいずれを使用する場合でも外部ファイルのロードに関するコードを同じにすることができ、ActionScript コードが簡潔になります。

サブトピック

URLLoader および URLVariables クラスの使用
外部ドキュメントからのデータのロード
外部スクリプトとの通信

URLLoader および URLVariables クラスの使用

ActionScript 3.0 では、LoadVars クラスが URLLoader クラスと URLVariables クラスに置き換えられました。URLLoader クラスは、指定した URL からテキスト、バイナリデータ、または URL エンコード形式の変数をダウンロードする際に使用します。データ駆動の動的な ActionScript アプリケーションで使用するテキストファイル、XML、その他の情報をダウンロードする場合には URLLoader クラスが便利です。URLLoader クラスでは ActionScript 3.0 の高度なイベント処理モデルを利用しているため、completehttpStatusioErroropenprogresssecurityError などのイベントを受け付けて処理できます。新しいイベント処理モデルはエラーやイベントをより効率よく扱うことができ、ActionScript 2.0 における LoadVars.onDataLoadVars.onHTTPStatusLoadVars.onLoad 各イベントハンドラのサポートに比べて大きく改良されています。イベントの処理の詳細については、イベントの処理.を参照してください。

ActionScript の以前のバージョンにおける XML クラスおよび LoadVars クラスの場合と
同様に、URLLoader でも、指定した URL のデータはダウンロードが完了するまで利用
可能となりません。ダウンロードの進捗状況 (ロード済みバイト数と合計バイト数) は、flash.events.ProgressEvent.PROGRESS イベントをリッスンすることにより監視
できますが、ファイルのロードが非常に早く完了した場合は ProgressEvent.PROGRESS
イベントが送出されないことがあります。ファイルのダウンロードが正常に完了すると、flash.events.Event.COMPLETE イベントが送出されます。ロードされたデータは、
UTF-8 または UTF-16 のエンコード形式からストリングにデコードされます。

メモ

 

URLRequest.contentType が設定されていない場合、値は application/x-www-form-urlencoded 形式で送信されます。

URLLoader.load() メソッドのパラメータは、URLRequest クラスのオブジェクトを指定する request パラメータの 1 つだけです (URLLoader クラスのコンストラクタにも、必要に応じて同じパラメータを指定できます)。URLRequest オブジェクトには、1 件の HTTP リクエストに関して、ターゲット URL、リクエストメソッド (GET または POST)、付加的なヘッダー情報、MIME タイプ (XML コンテンツのアップロード時など)、その他すべての情報が格納されます。

たとえば、XML パケットをサーバーサイドスクリプトにアップロードする場合の ActionScript 3.0 コードは次のようになります。

var secondsUTC:Number = new Date().time;
var dataXML:XML = 
    <login>
        <time>{secondsUTC}</time>
        <username>Ernie</username>
        <password>guru</password>
    </login>;
var request:URLRequest = new URLRequest("http://www.yourdomain.com/login.cfm");
request.contentType = "text/xml";
request.data = dataXML.toXMLString();
request.method = URLRequestMethod.POST;
var loader:URLLoader = new URLLoader();
try
{
    fr.download(request);
}
catch (error:ArgumentError)
{
    trace("An ArgumentError has occurred.");
}
catch (error:SecurityError)
{
    trace("A SecurityError has occurred.");
}

このコードでは、サーバーに送信する XML パケットを含んだ dataXml という XML インスタンスを作成します。次に URLRequest の contentType プロパティに "text/xml" を設定し、URLRequest の data プロパティに、XML.toXMLString() メソッドでストリングに変換した XML パケットの内容を設定します。最後に、新しい URLLoader インスタンスを作成し、URLLoader.load() メソッドを使用してリモートスクリプトに要求を送信します。

URL リクエストで渡すパラメータを指定するには、次の 3 つの方法があります。

URLVariables のコンストラクタまたは URLVariables.decode() メソッドで変数を定義する場合、アンパサンド文字 (&) は必ず URL エンコードしておく必要があります。アンパサンドには特別な意味があり、区切り文字として機能するからです。URL エンコードすると、アンパサンド &%26 になります。

外部ドキュメントからのデータのロード

動的なアプリケーションを ActionScript 3.0 で作成する場合、外部のファイルまたはサーバーサイドスクリプトからデータをロードするようにすると、ActionScript ファイルの編集と再コンパイルを必要としない動的なアプリケーションを実現できます。たとえば、"今日の一言" アプリケーションを作成する場合、サーバーサイドスクリプトで、データベースからランダムに選んだ一言を取得して 1 日 1 回テキストファイルに保存するようにします。そうすれば、ActionScript アプリケーションでは静的なテキストファイルをロードするだけでよく、毎回データベースへのクエリを発行する必要はなくなります。

次のコードでは、URLRequest オブジェクトと URLLoader オブジェクトを作成し、それによって "params.txt" という外部のテキストファイルから内容をロードします。

var request:URLRequest = new URLRequest("params.txt");
var loader:URLLoader = new URLLoader();
loader.load(request);

また、この例は次のように簡略化することもできます。

var loader:URLLoader = new URLLoader(new URLRequest("params.txt"));

リクエストメソッドを指定しない場合、Flash Player では、デフォルトで 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() メソッドを使用して分割し、配列に変換できます。

ヒント

 

外部データファイル内の変数名には、予約語やプログラミング言語の構成要素を含めないでください。そのような変数名を使用すると、コードの解読やデバッグ作業が困難になります。

データのロードが完了すると Event.COMPLETE イベントが送出され、次のように、URLLoader の data プロパティで外部ドキュメントの内容にアクセスできるようになります。

private function completeHandler(event:Event):void
{
    var loader2:URLLoader = URLLoader(event.target);
    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(",");

ヒント

 

外部テキストファイルから数値データをロードするには、トップレベル関数の int()uint()Number() などを使用して値を数値に変換する必要があります。

リモートファイルの内容をロードして新しい 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>

Flex 2.01