外部データの操作

ActionScript 3.0 には、外部ソースからデータをロードするメカニズムが含まれます。ソースは、テキストファイルなどの静的コンテンツや、データベースからデータを取得する Web スクリプトなどの動的コンテンツである場合があります。このデータはさまざまな方法でフォーマットすることができ、ActionScript の機能によりデータのデコードやアクセスが可能になります。また、データ取得のプロセスの一部として、外部サーバーにデータを送信することもできます。

サブトピック

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

URLLoader および URLVariables クラスの使用

ActionScript 3.0 では、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
{
    loader.load(request);
}
catch (error:ArgumentError)
{
    trace("An ArgumentError has occurred.");
}
catch (error:SecurityError)
{
    trace("A SecurityError has occurred.");
}

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

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

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

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

動的なアプリケーションを 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

このファイルには、monthNamesdayNames の 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>

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000316.html