aqubi+shin1

Recent site activity

Adobe Air‎ > ‎

URLLoader

Networkで通信する際、使えそうなモジュールは、
URLLoader, HttpAccessなどありますが、今回は URLLoader について。

基本的な使い方

var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest(urlPath);
loader.load(request);

URLLoaderとURLRequestを作成してloadメソッドを実行します。
んが、これだけだと単に実行するだけで結果もなにも返ってきません。
取得したい結果(イベント)は任意に設定してあげる形になります。

イベントの種類

各種イベントはEventListenerで取得します。

EventLisenerで取得できるイベントは以下があります。
イベント名
 イベントオブジェクトの型Event.type プロパティ
 complete flash.events.Event flash.events.Event.COMPLETE
 httpResponseStatus flash.events.HTTPStatusEvent flash.events.HTTPStatusEvent.HTTP_RESPONSE_STATUS
 httpStatus flash.events.HTTPStatusEvent flash.events.HTTPStatusEvent.HTTP_STATUS
 ioError flash.events.IOErrorEvent flash.events.IOErrorEvent.IO_ERROR
 open flash.events.Event flash.events.Event.OPEN
 progress flash.events.ProgressEvent flash.events.ProgressEvent.PROGRESS
 securityError flash.events.SecurityErrorEvent flash.events.SecurityErrorEvent.SECURITY_ERROR

結果を取得したいときには、completeを使います。
以下は、XMLを取得した例。
urlLoader.removeEventListener(Event.COMPLETE, onCompleted);
private function onCompleted(event:Event):void {
        var xml:XML  = new XML(event.target.data);
}

event.targetで使っているURLLoaderが取得できます。
event.target.dataというのはURLLoaderのdataプロパティを参照していて、このdataは取得結果の情報になります。


正常に処理が返ってきたとき(HTTPStatusが200)は、completeにイベントが来ますが、エラーが発生した場合にはイベントは発生しません。そのために、エラーのListenerも追加してあげる必要があります。
ioError, sercurityErrorですね。

urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
private function ioErrorHandler(event:IOErrorEvent):void {
    trace("IOError!");
 }

エラーになるけど、原因分からんからHttpヘッダーの中身を見たい!という時には、httpResponseStatusが使えます。
以下は、Headerの内容をtraceしてみた例。

loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponse);
private function httpResponse(event:HTTPStatusEvent):void {
    trace("responseURL: " + event.responseURL);
    for each(var h:Object in event.responseHeaders) {
        trace(h.name + ":" + h.value);
    }
}

エラーだったかどうか?の判断の一つの目安がHTTPステータスですが、これは httpStatusもしくはhttpResponseStatusで取得できます。
この2つの違いですが、リファレンスをみると、
httpResponseStatus
httpStatus イベントと異なり、httpResponseStatus イベントは応答データの前に配信されます。
とあるので、httpResponseStatusの方がいいかもしれないですねー。

送信時のHttpヘッダーの設定

webサービスのマッシュアップなんぞをやっているときには、HttpヘッダーにAcceptやらContent-typeやら設定しないと行けない場合があります。
それらの設定は URLRequest で行なってあげます。
var request:URLRequest;
request.contentType = 'application/xml';
request.requestHeaders.push(new URLRequestHeader("Accept", "application/xml"));

Cookieを使わないようにする

デフォルトではCookieが設定されるようです。
Airアプリケーションの中で、URLLoader,URLRequestのオブジェクトを複数作っても自動的に同じCookieがHttpHeaderに設定されるみたいです。まぁ、なんと優しい仕様ww
これを使わないようにするには、URLRequestのmanageCookiesプロパティをfalseにしてあげるとOK!

SlimTimerのクライアントを作っている時にハマったのが、一度ログイン認証に失敗するとその後のアクセスが全部HttpStatus=500になって返ってきてしまう。。。
EventListenerが綺麗にRemoveされてないとか?と色々見ていたんですが、原因がこのCookie.
Cookieを使用しないようにしたら、一度ログイン認証に失敗しても上手く動くようになりました。
そういうチェックをサーバ側でしてるんでしょうね。