[AS3.0]Flashでリッチなテキストエディタを作る Part1 [AS3]TextAreaのスクロールバーを自動で追従させる
12月 18

一つ前のエントリーの続きで、Flashでテキストエディタを作成中。編集したテキストおよびTextFormatをXML形式に変換して、サーバにPOSTし、保存する処理を作成中に、上記のエラーが発生。

Flash側からPHPへのPOSTについては、

AS3とPHPの連携 – 基礎 – memo.at sonic

を参考にさせてもらう。たしかに、load()でPOSTするというのには違和感を感じるが、これしかないのでしょうがない。(Socketベースで通信する場合はセキュリティポリシーファイル/サーバが必要でさらに面倒)

[as]
// テキストフィールドのフォーマットを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);
[/as]

PHP側は、$_POSTで受信したデータをDBに保存する処理を記述。

$data = $_POST["body"];
// ~DBに書き出す処理・省略~
exit;

で、FlashIDE上でプレビューしてみると、

Error: Error #2101: URLVariables.decode() に渡される文字列は、名前/値のペアを含む、URL エンコーディングされたクエリー文字列でなければなりません。

という、エラーが発生。おかしいなぁ。ちゃんとURLVariablesで値を渡していて、URLエンコーディングされたクエリー文字列が生成されてるんだけどナーと思い、悩むこと30分。

やっと分かった。

呼び出し時にエラーになってるんじゃなく、呼び出した後にエラーになっている。つまり、

[as]
loader.load(req);
[/as]

で、呼び出すURLからのレスポンスが、key=value形式になってないとエラーになるのである。

しかし、POSTしても別にレスポンスを見ないケースもあるだろうにネー。

しょうがないので、php側でexitする前に echo “ret=true”;とダミーのレスポンスを返すことにする。コレでエラーは無くなった。

TextField2XMLのソースは、まだ調整中なので公開できないけど、XMLの読み書きが完了したら、サンプルとして公開する予定。

それにしても、as3になってから、URLへのGET,POSTや、FlashVarsへのアクセスが煩雑になって面倒この上ない。だれかas2互換のラッパー関数とか作ってないかな。ついでにJavaScript互換関数とかPHP互換関数とかあると嬉しいな。

知っていたら教えてください。

Popularity: 15% [?]

written by ANN

add to hatena hatena.comment (3) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (1) Total: 4

One Response to “[AS3]Error: Error #2101: URLVariables.decode() に渡される文字列は、名前/値のペアを含む、URL エンコーディングされたクエリー文字列でなければなりません。”

  1. どうけ Says:

    こちら、大変参考になりました。
    同様のエラーについての記述がほとんど見当たらず、助かりました。

    ただ、こちらはそもそも
    URLVariables.dataFormat を TEXTにすれば解決するような気がします。

    件のエラーは、レスポンスがXMLのようなFlashVars的なkey=valueでなないメタデータであるからで、単にテキストとして通信したものをFlashでXMLとして解釈する場合はTEXTにしておけば大体大丈夫かと思われます。
    参考になれば幸いです。

Leave a Reply