XMLHTTPRequestっぽいライブラリの試作品
Flash経由でXMLHTTPRequestっぽいことをするライブラリといえば:
- http://www.qrone.org/qrx/doc/crossdomain_js.html
- Flashを使った半クロスドメインのXMLHttpRequestのようなもの - ヒルズで働く@robarioの技ログ
といったものが既にあるわけですが、もうちょっとこう、なんというか、オレサマ仕様にしたかったので、自作することにした。以下、試作品のソース。
package com.iwamot.net { import bridge.FABridge; import com.adobe.serialization.json.JSON; import com.dynamicflash.util.Base64; import flash.display.Sprite; import flash.net.*; public class HttpRequest extends Sprite { protected var _loader:URLLoader = new URLLoader(); public function HttpRequest():void { var _bridge:FABridge = new FABridge(); _bridge.rootObject = this; } public function oncomplete(callback:Function):void { _loader.addEventListener('complete', callback); } public function onerror(callback:Function):void { _loader.addEventListener('ioError', callback); _loader.addEventListener('securityError', callback); } public function doGet( url:String, content:Object, userName:String = null, password:String = null ):void { doRequest(url, content, userName, password, 'GET'); } public function doPost( url:String, content:Object, userName:String = null, password:String = null ):void { doRequest(url, content, userName, password); } public function doPut( url:String, content:Object, userName:String = null, password:String = null ):void { doRequest(url, content, userName, password, 'PUT'); } public function doDelete( url:String, content:Object, userName:String = null, password:String = null ):void { doRequest(url, content, userName, password, 'DELETE'); } public function responseJson():Object { return JSON.decode(_loader.data); } protected function doRequest( url:String, content:Object, userName:String = null, password:String = null, method:String = 'POST' ):void { var request:URLRequest = new URLRequest(url); request.method = URLRequestMethod.POST; var variables:URLVariables = new URLVariables(); variables._method = method; for (var key:String in content) { if (key.match(/\D/)) { variables[key] = content[key]; } } request.data = variables; if (userName != null && password != null) { var token:String = userName + ':' + password; var auth:String = 'Basic ' + Base64.encode(token); request.requestHeaders.push( new URLRequestHeader('Authorization', auth) ); } _loader.load(request); } } }
URLRequestを使うと、POSTリクエスト時にしかリクエストヘッダが付けられない。POST以外でもBasic認証したかったのだが、どうにもならんので、POSTで「_method」を送ることにした。HTTPServiceなどを使えばどうにかなるのかもしれないが、結局分からんかった。
JavaScript側の呼び出しサンプルも書こうかと思ったが、Firefoxでしか動かないのでやめた。上記試作品の問題かもしれないので、引き続きあれこれ試してみる。