feb19.jp

Nobuhiro Takahashi
Designer / Engineer

AS3でPHPと通信する

AS3でPHPと通信する

AS3からPHPにPOSTし、PHPからURLLoaderDataFormat.VARIABLE形式でデータを受け取る、AS2のLoadVars.sendAndLoadな方法。

変数がArrayとかObjectで入れ子になったたりするのではなく、ただただシンプルな文字列の通信。

1. AS3からPHPにデータを送る準備

URLRequest.data = URLVariablesインスタンス;
URLRequest.method = URLRequestMethod.POST;

URLVariablesは、FlashからPHPに対して送る「SENDデータ」を「オブジェクト形式」で入れるもの。これが、PHPにパラメータとして渡されます。
URLRequestMethodは、FlashからPHPに送るときの送信方法。GETか、POST。パラメータが長い文字列になるときは、POSTを使います。GETを使いたいときは、URL以降に「?」
をつけて変数を再利用したいときに使ったりします。というか、PHPとの通信なら基本的にはPOSTですかね?

詳しくはこちらのページで。(「GETとPOST」)


2. 通信

URLLoader.dataFormat = URLLoaderDataFormat.VARIABLES;

URLLoaderインスタンスのデータフォーマットをURLLoaderDataFormat.VARIABLESに。
これで、PHPからデータを受け取れる。(PHPの記述がそうなっていれば)


3. PHPからFlashでデータを受け取る

URLLoaderのEvent.COMPLETEイベントハンドラ内部で、

var urlVariables:URLVariables = new URLVariables(e.target.data);
var obj:Object = new Object();
for (var i:String in urlVariables)
{
	obj[i] = urlVariables[i];
}

こうするとObject型にできる。


4. 一連をクラスにしてみました

package 
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.net.URLLoader;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.net.URLVariables;
	
	/**
	* ConnectPHP
	* @author feb19
	*/
	public class ConnectPHP extends EventDispatcher
	{
		public static const COMPLETE:String = "connectPHP_complete";
		
		private var _result:Object = new Object();
		
		public function ConnectPHP(url:String = null, variables:Object = null)
		{
			if (url && variables)
			{
				sendAndLoad(url, variables);
			}
		}
		public function sendAndLoad(url:String, variables:Object):void
		{
			var urlRequest:URLRequest = new URLRequest(url);
			
			var urlVariables:URLVariables = new URLVariables();
			
			for (var i:String in variables)
			{
				urlVariables[i] = variables[i];
			}
			
			urlRequest.data = urlVariables;
			urlRequest.method = URLRequestMethod.POST;
			
			var urlLoader:URLLoader = new URLLoader();
			urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
			urlLoader.addEventListener(Event.COMPLETE, completeHandler);
			urlLoader.load(urlRequest);
		}
		private function completeHandler(e:Event):void
		{
			var urlVariables:URLVariables = new URLVariables(e.target.data);
			var obj:Object = new Object();
			for (var i:String in urlVariables)
			{
				obj[i] = urlVariables[i];
			}
			
			_result = obj;
			
			dispatchEvent(new Event(COMPLETE));
		}
		public function get result():Object
		{
			return _result;
		}
	}
}


使いかた

PHPに文字列データを送信して、それをPHP側で改造して戻す、通信のサンプル。

送られてきたデータに対して、「っこー!!」という文字列を追加するだけのPHPサンプルです。

unko.php
 
<?php
$unko = $_POST["unko"];
echo "unko=".$unko."っこー!!";
?>

Flash側ではSENDデータをObject型でつくり、ConnectPHPインスタンスのload関数でURLと一緒に引数で渡してやります。

[FLASH] connectPHPExample
 
var sendData:Object = new Object();
sendData.unko = "うんこ";
 
var connectPHP:ConnectPHP = new ConnectPHP();
connectPHP.addEventListener(ConnectPHP.COMPLETE, completeHandler);
connectPHP.load("unko.php", sendData);
 
function completeHandler(e:Event):void
{
	var result:Object = connectPHP(e.currentTarget).result;
	trace(result.unko);	//出力:うんこっこー!!
}

ConnectPHP.COMPLETEイベントの内部でConnectPHP.resultオブジェクトを受け取り、トレースしています。

文字列が頭悪くてすみません。

このクラスの場合、オブジェクトが入れ子になってたりすると分解しきれません。シンプルに入れ子になっていないオブジェクトの受け渡しだけに対応しています。

オブジェクトが入れ子になっている場合にお使いになりたいときは、もうちょいアレコレ改造されて使うと素敵だと思います。

Navigation

prev: 英単語速打[eitango-sokuda] タイピングゲーム ブログパーツ
next: A Flash Polyphonic Synthesizer

Recently Entries