最近、お仕事で Zend AMF と戯れる機会がありまして、ハマった事柄を備忘録として残しておきます。
ドキュメントに記されている NetConnection.call() メソッドの引数は以下の通り。
public function call(command:String, responder:Responder, ... arguments):void
NetConnection.call() メソッドを使用して、PHP のサービス ( メソッド ) を呼び出すとき、call() メソッドの第 3 引数 (arguments) に渡す値の内容によって、AMF バージョンの解釈が変わることが分かりました。
結果は以下の通りです。
環境 : Flex 4.5, Zend AMF 1.11.7
//AMF0 として解釈
nc.call("PHPService.test", responder);
//AMF0 として解釈
nc.call("PHPService.test", responder, null);
//AMF3 として解釈
nc.call("PHPService.test", responder, []);
//AMF3 として解釈
nc.call("PHPService.test", responder, ["hoge", "fuga"]);
//AMF0 として解釈
nc.call("PHPService.test", responder, "hoge");
//AMF0 として解釈
nc.call("PHPService.test", responder, 111);
//AMF0 として解釈
nc.call("PHPService.test", responder, "hoge", "fuga");
//AMF3 として解釈
nc.call("PHPService.test", responder, [], "hoge", "fuga");
//AMF3 として解釈
nc.call("PHPService.test", responder, "hoge", "fuga", []);
//AMF0 として解釈
nc.call("PHPService.test", responder, 1, 2, 3, 4);
//AMF3 として解釈
nc.call("PHPService.test", responder, {});
//AMF3 として解釈
nc.call("PHPService.test", responder, new XML());
//AMF3 として解釈
nc.call("PHPService.test", responder, new Date());
//AMF0 として解釈
nc.call("PHPService.test", responder, true);
どうやら、arguments パラメータに非プリミティブ値 ( 複合値… Array、Date、Error、Function、RegExp、XML、XMLList など ) のオブジェクトが 1 つでも含まれていれば AMF3 として解釈されるようです。以下のように、NetConnection オブジェクトのエンコードを指定しても、無視されるので注意が必要です。
NetConnection.objectEncoding = ObjectEncoding.AMF3;
画像のバイナリを ByteArray として取得しようとしたときに、どハマりして困りました。