アーカイブ

Zend AMF 使用時の NetConnection.call() メソッド諸注意

最近、お仕事で 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 として取得しようとしたときに、どハマりして困りました。