忍者ブログ
研究室生活のメモ・・・だった過去の遺産。移転先→http://negimochix2.blogspot.com/
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

GDP企画の際必要になった,ActionScriptを使ったXMLの送受信.
Flash/AIRとPHP間でXMLのやりとりをするのに使った.

試行錯誤した結果,結局こんな感じでうまくいくことがわかった.
基本的に,URLRequestで送信データ,およびその設定を行い,
URLLoaderでリクエスト(送信),Completeイベントでphpからのレスポンスが帰ってくる仕組み.
  1. package {  
  2.     import flash.events.Event;  
  3.     import flash.events.ProgressEvent;  
  4.     import flash.events.IOErrorEvent;  
  5.     import flash.events.EventDispatcher;  
  6.     import flash.net.URLLoader;  
  7.     import flash.net.URLRequest;  
  8.     import flash.net.URLRequestMethod;  
  9.     import flash.utils.ByteArray;  
  10.       
  11.     /** 
  12.     * ConnectPHP 
  13.     * @auther kusamochi 
  14.     */  
  15.     public class ConnectPHP extends EventDispatcher {  
  16.         public static const COMPLETE:String = "complete";  
  17.         public static const IO_ERROR:String = "io_error";  
  18.         public static const PROGRESS:String = "progress";  
  19.         public static const FAILED:String = "failed";  
  20.           
  21.         private var _urlRequest:URLRequest;  
  22.         private var _result:XML;  
  23.           
  24.         private var urlLoader:URLLoader;  
  25.           
  26.         // コンストラクタ  
  27.         public function ConnectPHP() {  
  28.         }  
  29.           
  30.         // XMLの送信  
  31.         public function sendAndLoad_XML(url:String, xml:XML):void {  
  32.             // 送信するデータを設定  
  33.             _urlRequest = new URLRequest(url);  
  34.             _urlRequest.contentType = "text/xml";  
  35.             _urlRequest.data = xml.toXMLString();  
  36.             // データはPOSTで送信  
  37.             _urlRequest.method = URLRequestMethod.POST;  
  38.               
  39.             // URL  
  40.             urlLoader = new URLLoader();  
  41.             urlLoader.dataFormat = URLLoaderDataFormat.TEXT;  
  42.               
  43.             // イベントリスナー登録  
  44.             urlLoader.addEventListener(Event.COMPLETE, completeHandler);  
  45.             urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);  
  46.             urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
  47.             urlLoader.load(_urlRequest);  
  48.         }  
  49.           
  50.         // データロード完了のイベントリスナー  
  51.         private function completeHandler(event:Event):void {  
  52.             urlLoader.removeEventListener(Event.COMPLETE, completeHandler);  
  53.             urlLoader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);  
  54.             urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
  55.             // reusltに格納  
  56.             try {  
  57.                 _result = new XML(event.target.data);  
  58.             }  
  59.             catch(error:TypeError) {  
  60.                 // イベントをブロードキャスト  
  61.                 dispatchEvent(new Event(FAILED));  
  62.                 return;  
  63.             }  
  64.                           
  65.             // イベントをブロードキャスト  
  66.             dispatchEvent(new Event(COMPLETE));  
  67.         }  
  68.           
  69.         // 送信中に一定間隔で発生するイベントリスナー  
  70.         private function progressHandler(event:ProgressEvent):void {  
  71.             // イベントをブロードキャスト  
  72.             dispatchEvent(new ProgressEvent(PROGRESS));           
  73.         }  
  74.           
  75.         // 送信エラーのイベントリスナー  
  76.         private function ioErrorHandler(event:IOErrorEvent):void {  
  77.             urlLoader.removeEventListener(Event.COMPLETE, completeHandler);  
  78.             urlLoader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);  
  79.             urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
  80.             // イベントをブロードキャスト  
  81.             dispatchEvent(new IOErrorEvent(IO_ERROR));  
  82.         }  
  83.           
  84.         // 参照削除  
  85.         public function deleteReference():void {  
  86.             if(urlLoader) {  
  87.                 urlLoader.addEventListener(Event.COMPLETE, completeHandler);  
  88.                 urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);  
  89.                 urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
  90.                 urlLoader.close();  
  91.             }  
  92.             _urlRequest = null;  
  93.             _result = null;  
  94.         }  
  95.           
  96.         // getter //////////////////////////////////////////////////////  
  97.         // result  
  98.         public function get result():XML {  
  99.             if(_result) return _result;  
  100.             else        return null;  
  101.         }  
  102.     }  
  103. }  
ポイントは,Content-typeを"text/xml"にして,xmlのStringを送信すること.
当初,Content-typeを"application/octet-stream"(バイナリデータの意)として,
XMLをBinaryArrayで送っていたけど,
それだと送信先でヘッダーに文字化けが起きる.

ちなみに,PHP側では,
  1. $inputStr = file_get_contents("php://input");  
  2. $xml = simplexml_load_string($inputStr);  
  3.   
  4. print "<result>";  
  5. // Flash側に送りたいデータをほげほげ  
  6. print "</result>";  
というように,file_get_contents("php://input")で,
生データを丸ごと読みこんでPHPのXMLクラスに変換.
Flash側に送りたいXMLは,PHP自身にタグをprintすればいい.
PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Infomation
くさもち 【中の人】
・くさもち
・ボカロ廃大学院生
・βからのニコ厨
・もちろん非リア充
・ミクZ4 第二期個人スポンサー

【メール】
・negimochi.tabetai(゚Д゚)gmail.com
(゚Д゚)→@

【その他やってるもの】
Twitter

・これは痛いピアプロ
・過去の遺産smart.fm

【作ったもの】
・製作に参加したDTX GDPメインサイト
で,実際に作ったIRページ
カレンダー
10 2025/11 12
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
Heartsnative
『Heartsnative/MOSAIC.WAV×鶴田加茂 feat.初音ミク』応援中!
VOCALOID Ranking Watcher
新曲は常にチェックすべし。
真・フルみっくすプレイヤー
おすすめ記事
jubeat ripples
今更やってみる