一つ前のエントリーの続きで、Flashでテキストエディタを作成中。編集したテキストおよびTextFormatをXML形式に変換して、サーバにPOSTし、保存する処理を作成中に、上記のエラーが発生。
Flash側からPHPへのPOSTについては、
AS3とPHPの連携 - 基礎 - memo.at sonic
を参考にさせてもらう。たしかに、load()でPOSTするというのには違和感を感じるが、これしかないのでしょうがない。(Socketベースで通信する場合はセキュリティポリシーファイル/サーバが必要でさらに面倒)
Actionscript:
// テキストフィールドのフォーマットをXMLに落とし込む var txtxml:TextField2XML = new TextField2XML(_targetText); var v:URLVariables = new URLVariables(); v.body = txtxml.getXML(); var req:URLRequest = new URLRequest("ポスト先のURL"); req.data = v; req.method = URLRequestMethod.POST; var loader:URLLoader = new URLLoader(req); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.load(req);
PHP側は、$_POSTで受信したデータをDBに保存する処理を記述。
PHP:
$data = $_POST["body"]; // ~DBに書き出す処理・省略~ exit;
で、FlashIDE上でプレビューしてみると、
Error: Error #2101: URLVariables.decode() に渡される文字列は、名前/値のペアを含む、URL エンコーディングされたクエリー文字列でなければなりません。
という、エラーが発生。おかしいなぁ。ちゃんとURLVariablesで値を渡していて、URLエンコーディングされたクエリー文字列が生成されてるんだけどナーと思い、悩むこと30分。
やっと分かった。
呼び出し時にエラーになってるんじゃなく、呼び出した後にエラーになっている。つまり、
Actionscript:
loader.load(req);
で、呼び出すURLからのレスポンスが、key=value形式になってないとエラーになるのである。
しかし、POSTしても別にレスポンスを見ないケースもあるだろうにネー。
しょうがないので、php側でexitする前に echo "ret=true";とダミーのレスポンスを返すことにする。コレでエラーは無くなった。
TextField2XMLのソースは、まだ調整中なので公開できないけど、XMLの読み書きが完了したら、サンプルとして公開する予定。
それにしても、as3になってから、URLへのGET,POSTや、FlashVarsへのアクセスが煩雑になって面倒この上ない。だれかas2互換のラッパー関数とか作ってないかな。ついでにJavaScript互換関数とかPHP互換関数とかあると嬉しいな。
知っていたら教えてください。
Popularity: 18% [?]




