研究室生活のメモ・・・だった過去の遺産。移転先→http://negimochix2.blogspot.com/
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
GDP企画の際必要になった,ActionScriptを使ったXMLの送受信.
Flash/AIRとPHP間でXMLのやりとりをするのに使った.
試行錯誤した結果,結局こんな感じでうまくいくことがわかった.
基本的に,URLRequestで送信データ,およびその設定を行い,
URLLoaderでリクエスト(送信),Completeイベントでphpからのレスポンスが帰ってくる仕組み.
当初,Content-typeを"application/octet-stream"(バイナリデータの意)として,
XMLをBinaryArrayで送っていたけど,
それだと送信先でヘッダーに文字化けが起きる.
ちなみに,PHP側では,
生データを丸ごと読みこんでPHPのXMLクラスに変換.
Flash側に送りたいXMLは,PHP自身にタグをprintすればいい.
Flash/AIRとPHP間でXMLのやりとりをするのに使った.
試行錯誤した結果,結局こんな感じでうまくいくことがわかった.
基本的に,URLRequestで送信データ,およびその設定を行い,
URLLoaderでリクエスト(送信),Completeイベントでphpからのレスポンスが帰ってくる仕組み.
package {
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.utils.ByteArray;
/**
* ConnectPHP
* @auther kusamochi
*/
public class ConnectPHP extends EventDispatcher {
public static const COMPLETE:String = "complete";
public static const IO_ERROR:String = "io_error";
public static const PROGRESS:String = "progress";
public static const FAILED:String = "failed";
private var _urlRequest:URLRequest;
private var _result:XML;
private var urlLoader:URLLoader;
// コンストラクタ
public function ConnectPHP() {
}
// XMLの送信
public function sendAndLoad_XML(url:String, xml:XML):void {
// 送信するデータを設定
_urlRequest = new URLRequest(url);
_urlRequest.contentType = "text/xml";
_urlRequest.data = xml.toXMLString();
// データはPOSTで送信
_urlRequest.method = URLRequestMethod.POST;
// URL
urlLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
// イベントリスナー登録
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
urlLoader.load(_urlRequest);
}
// データロード完了のイベントリスナー
private function completeHandler(event:Event):void {
urlLoader.removeEventListener(Event.COMPLETE, completeHandler);
urlLoader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
// reusltに格納
try {
_result = new XML(event.target.data);
}
catch(error:TypeError) {
// イベントをブロードキャスト
dispatchEvent(new Event(FAILED));
return;
}
// イベントをブロードキャスト
dispatchEvent(new Event(COMPLETE));
}
// 送信中に一定間隔で発生するイベントリスナー
private function progressHandler(event:ProgressEvent):void {
// イベントをブロードキャスト
dispatchEvent(new ProgressEvent(PROGRESS));
}
// 送信エラーのイベントリスナー
private function ioErrorHandler(event:IOErrorEvent):void {
urlLoader.removeEventListener(Event.COMPLETE, completeHandler);
urlLoader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
// イベントをブロードキャスト
dispatchEvent(new IOErrorEvent(IO_ERROR));
}
// 参照削除
public function deleteReference():void {
if(urlLoader) {
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
urlLoader.close();
}
_urlRequest = null;
_result = null;
}
// getter //////////////////////////////////////////////////////
// result
public function get result():XML {
if(_result) return _result;
else return null;
}
}
}
ポイントは,Content-typeを"text/xml"にして,xmlのStringを送信すること.当初,Content-typeを"application/octet-stream"(バイナリデータの意)として,
XMLをBinaryArrayで送っていたけど,
それだと送信先でヘッダーに文字化けが起きる.
ちなみに,PHP側では,
$inputStr = file_get_contents("php://input");
$xml = simplexml_load_string($inputStr);
print "<result>";
// Flash側に送りたいデータをほげほげ
print "</result>";
というように,file_get_contents("php://input")で,生データを丸ごと読みこんでPHPのXMLクラスに変換.
Flash側に送りたいXMLは,PHP自身にタグをprintすればいい.
PR
この記事にコメントする
Infomation
・くさもち
・ボカロ廃大学院生
・βからのニコ厨
・もちろん非リア充
・ミクZ4 第二期個人スポンサー
【メール】
・negimochi.tabetai(゚Д゚)gmail.com
(゚Д゚)→@
【その他やってるもの】
・Twitter
・これは痛いピアプロ
・過去の遺産smart.fm
【作ったもの】
・製作に参加したDTX GDPメインサイト
で,実際に作ったIRページ
・これは痛いピアプロ
・過去の遺産smart.fm
【作ったもの】
・製作に参加したDTX GDPメインサイト
で,実際に作ったIRページ
カレンダー
| 09 | 2025/10 | 11 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
カテゴリー
VOCALOID Ranking Watcher
新曲は常にチェックすべし。
おすすめ記事
jubeat ripples
今更やってみる
最新記事
(05/02)
(01/08)
(11/26)
(11/24)
(11/13)
(11/06)
(11/06)
