岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

XMLHTTPRequestっぽいライブラリの試作品

Flash経由でXMLHTTPRequestっぽいことをするライブラリといえば:

といったものが既にあるわけですが、もうちょっとこう、なんというか、オレサマ仕様にしたかったので、自作することにした。以下、試作品のソース。

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でしか動かないのでやめた。上記試作品の問題かもしれないので、引き続きあれこれ試してみる。