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を使用しないようにしたら、一度ログイン認証に失敗しても上手く動くようになりました。 そういうチェックをサーバ側でしてるんでしょうね。
|