Zend_Amf-Server.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 15728 -->
  4. <sect1 id="zend.amf.server">
  5. <title>Zend_Amf_Server</title>
  6. <para>
  7. <classname>Zend_Amf_Server</classname> は RPC スタイルのサーバで、
  8. Adobe Flash Player からの AMF プロトコルによるリクエストを処理します。
  9. 他の Zend Framework のサーバクラス群と同様に SoapServer API にしたがっており、
  10. サーバを作成するための習得しやすいインターフェイスを提供します。
  11. </para>
  12. <example id="zend.amf.server.basic">
  13. <title>基本的な AMF サーバ</title>
  14. <para>
  15. さまざまな public メソッドを持つクラス <emphasis>Foo</emphasis>
  16. を作ったものとしましょう。AMF サーバを作成するためのコードは次のようになります。
  17. </para>
  18. <programlisting language="php"><![CDATA[
  19. $server = new Zend_Amf_Server();
  20. $server->setClass('Foo');
  21. $response = $server->handle();
  22. echo $response;
  23. ]]></programlisting>
  24. <para>
  25. もうひとつの方法として、単純な関数をコールバックとしてアタッチすることもできます。
  26. </para>
  27. <programlisting language="php"><![CDATA[
  28. $server = new Zend_Amf_Server();
  29. $server->addFunction('myUberCoolFunction');
  30. $response = $server->handle();
  31. echo $response;
  32. ]]></programlisting>
  33. <para>
  34. 複数のクラスや関数を混ぜて使用することもできます。
  35. その場合は、それぞれに名前空間を指定してメソッド名の衝突を回避させることをおすすめします。
  36. 名前空間を指定するには、<methodname>addFunction()</methodname> あるいは
  37. <methodname>setClass()</methodname> の 2 番目の引数に文字列を指定します。
  38. </para>
  39. <programlisting language="php"><![CDATA[
  40. $server = new Zend_Amf_Server();
  41. $server->addFunction('myUberCoolFunction', 'my')
  42. ->setClass('Foo', 'foo')
  43. ->setClass('Bar', 'bar');
  44. $response = $server->handle();
  45. echo $response;
  46. ]]></programlisting>
  47. <para>
  48. <classname>Zend Amf Server</classname> は、
  49. 指定したディレクトリパスから動的にサービスに読み込ませることもできます。
  50. 好きなだけのディレクトリをサーバに指定することが可能です。
  51. サーバに後から追加したディレクトリから順に (<emphasis>LIFO</emphasis>: 後入れ先出し)
  52. 検索を行い、クラスにマッチするディレクトリを探します。
  53. ディレクトリの追加は <methodname>addDirectory()</methodname> メソッドで行います。
  54. </para>
  55. <programlisting language="php"><![CDATA[
  56. $server->addDirectory(dirname(__FILE__) .'/../services/');
  57. $server->addDirectory(dirname(__FILE__) .'/../package/');
  58. ]]></programlisting>
  59. <para>
  60. リモートサービスをコールする際には、アンダースコア ("_") およびドット
  61. (".") をディレクトリ区切り文字として使用します。
  62. アンダースコアを使用すると、<emphasis>PEAR</emphasis> や
  63. Zend Framework のクラス命名規約に従った形式となります。
  64. つまり、サービス <classname>com_Foo_Bar</classname> をコールした場合は、
  65. インクルードされたパスのどこかにある
  66. <filename>com/Foo/Bar.php</filename> を探します。ドット記法を使用してリモートサービスを
  67. <filename>com.Foo.Bar</filename> のように指定すると、
  68. インクルードされたパスの最後に <filename>com/Foo/Bar.php</filename>
  69. を追加して <filename>Bar.php</filename> を自動的に読み込みます。
  70. </para>
  71. <para>
  72. スクリプトに送られたすべての AMF リクエストがサーバで処理され、
  73. その結果の AMF レスポンスが返されます。
  74. </para>
  75. </example>
  76. <note>
  77. <title>アタッチされるすべてのメソッドや関数には docblock が必要</title>
  78. <para>
  79. Zend Framework の他のサーバコンポーネント群と同様、クラスのメソッドには
  80. PHP docblock 形式のドキュメントが必要です。
  81. 少なくとも必須引数と返り値についてのアノテーションが必要となります。
  82. 次の例をごらんください。
  83. </para>
  84. <programlisting language="php"><![CDATA[
  85. // アタッチする関数
  86. /**
  87. * @param string $name
  88. * @param string $greeting
  89. * @return string
  90. */
  91. function helloWorld($name, $greeting = 'Hello')
  92. {
  93. return $greeting . ', ' . $name;
  94. }
  95. ]]></programlisting>
  96. <programlisting language="php"><![CDATA[
  97. // アタッチするクラス
  98. class World
  99. {
  100. /**
  101. * @param string $name
  102. * @param string $greeting
  103. * @return string
  104. */
  105. public function hello($name, $greeting = 'Hello')
  106. {
  107. return $greeting . ', ' . $name;
  108. }
  109. }
  110. ]]></programlisting>
  111. <para>
  112. その他のアノテーションを使用することもできますが、無視されます。
  113. </para>
  114. </note>
  115. <sect2 id="zend.amf.server.flex">
  116. <title>サーバへの Flex からの接続</title>
  117. <para>
  118. <classname>Zend_Amf_Server</classname> に Flex プロジェクトから接続するのはきわめて簡単です。
  119. エンドポイントの URI を
  120. <classname>Zend_Amf_Server</classname> スクリプトに指定するだけでよいのです。
  121. </para>
  122. <para>
  123. たとえば、作成したサーバをアプリケーションルートに
  124. <filename>server.php</filename> という名前で配置したとしましょう。URI は
  125. <filename>http://example.com/server.php</filename> となります。
  126. この場合は、services-config.xml ファイルを編集して、
  127. チャンネルのエンドポイント URI 属性をこの値に変更します。
  128. </para>
  129. <para>
  130. まだ <filename>service-config.xml</filename> ファイルを作っていない場合は、
  131. まずナビゲータウィンドウでプロジェクトを開きます。
  132. そしてプロジェクト名のところを右クリックして 'プロパティ' を選択します。
  133. プロジェクトのプロパティダイアログで 'Flex ビルドパス' を選択し、
  134. 'ライブラリパス' タブで '<filename>rpc.swc</filename>'
  135. ファイルがプロジェクトに追加されていることを確認したら、
  136. OK を押してウィンドウを閉じます。
  137. </para>
  138. <para>
  139. また、リモートオブジェクトのエンドポイントを探す際に <filename>service-config.xml</filename>
  140. を使用することをコンパイラに指定する必要もあります。
  141. ナビゲータのプロジェクトフォルダを右クリックしてプロパティを選択し、
  142. もういちどプロジェクトのプロパティパネルを開きます。
  143. そこで 'Flex コンパイラ' を選択して、
  144. -services "services-config.xml" を追加します。
  145. 適用、そして OK を押してオプションを更新します。
  146. これで結局何をやったのかというと、実行時の変数を
  147. <filename>services-config.xml</filename> から読み込んで RemotingObject クラスで使うよう
  148. Flex コンパイラに指示したということです。
  149. </para>
  150. <para>
  151. それから、リモートメソッドへの接続の際に使用するサービス設定ファイルを
  152. Flex に教えてやる必要があります。そこで、Flex プロジェクトの src フォルダに
  153. 'services-config.xml' ファイルを新たに作成します。
  154. プロジェクトフォルダで右クリックして '新規作成' 'ファイル'
  155. を選択すると新しいウィンドウが開きます。プロジェクトフォルダを選択し、
  156. ファイル名を 'services-config.xml' と指定して終了を押します。
  157. </para>
  158. <para>
  159. Flex は新しい <filename>services-config.xml</filename> ファイルを作成し、それを開きます。
  160. 次の例のとおりに <filename>services-config.xml</filename> ファイルを作成してください。
  161. エンドポイントの部分はあなたが使用するサーバに書き換えます。
  162. そしてファイルを保存することを忘れないようにしましょう。
  163. </para>
  164. <programlisting language="xml"><![CDATA[
  165. <?xml version="1.0" encoding="UTF-8"?>
  166. <services-config>
  167. <services>
  168. <service id="zend-service"
  169. class="flex.messaging.services.RemotingService"
  170. messageTypes="flex.messaging.messages.RemotingMessage">
  171. <destination id="zend">
  172. <channels>
  173. <channel ref="zend-endpoint"/>
  174. </channels>
  175. <properties>
  176. <source>*</source>
  177. </properties>
  178. </destination>
  179. </service>
  180. </services>
  181. <channels>
  182. <channel-definition id="zend-endpoint"
  183. class="mx.messaging.channels.AMFChannel">
  184. <endpoint uri="http://example.com/server.php"
  185. class="flex.messaging.endpoints.AMFEndpoint"/>
  186. </channel-definition>
  187. </channels>
  188. </services-config>
  189. ]]></programlisting>
  190. <para>
  191. この例にはポイントがふたつあります。まず
  192. AMF チャネルを作成し、そしてエンドポイントの URL を
  193. <classname>Zend_Amf_Server</classname> に指定します。
  194. </para>
  195. <programlisting language="xml"><![CDATA[
  196. <channel-definition id="zend-endpoint"
  197. <endpoint uri="http://example.com/server.php"
  198. class="flex.messaging.endpoints.AMFEndpoint"/>
  199. </channel-definition>
  200. ]]></programlisting>
  201. <para>
  202. このチャネルの ID として "zend-endpoint" を指定したことに注意しましょう。
  203. この例では、このチャネルを指すサービスを作成して、その ID を指定しました。
  204. この場合の ID は "zend" となります。
  205. </para>
  206. <para>
  207. Flex の <emphasis>MXML</emphasis> ファイルで、
  208. RemoteObject をサービスにバインドしなければなりません。
  209. <emphasis>MXML</emphasis> で次のように記述します。
  210. </para>
  211. <programlisting language="xml"><![CDATA[
  212. <mx:RemoteObject id="myservice"
  213. fault="faultHandler(event)"
  214. showBusyCursor="true"
  215. destination="zend">
  216. ]]></programlisting>
  217. <para>
  218. ここでは、新しいリモートオブジェクトに "myservice" という名前をつけ、
  219. さきほど <filename>services-config.xml</filename> で定義した "zend"
  220. にそれをバインドしています。ActionScript からメソッドをコールするには、
  221. "myservice.&lt;method&gt;" とするだけです。例を示します。
  222. </para>
  223. <programlisting language="ActionScript"><![CDATA[
  224. myservice.hello("Wade");
  225. ]]></programlisting>
  226. <para>
  227. 名前空間を使う場合は
  228. "myservice.&lt;namespace&gt;.&lt;method&gt;" のようにします。
  229. </para>
  230. <programlisting language="ActionScript"><![CDATA[
  231. myservice.world.hello("Wade");
  232. ]]></programlisting>
  233. <para>
  234. Flex RemoteObject の実行についてのより詳細な情報は <ulink
  235. url="http://livedocs.adobe.com/flex/3/html/help.html?content=data_access_4.html">
  236. Adobe Flex 3 のヘルプサイト</ulink> をごらんください。
  237. </para>
  238. </sect2>
  239. <sect2 id="zend.amf.server.errors">
  240. <title>エラー処理</title>
  241. <para>
  242. デフォルトでは、アタッチしたクラスや関数からスローされた例外はすべて捕捉され、
  243. AMF ErrorMessage として返されます。しかし、この ErrorMessage
  244. オブジェクトの中身は、サーバが "production" モード (デフォルトの状態)
  245. であるか否かによって異なります。
  246. </para>
  247. <para>
  248. production モードの場合は、例外コードのみが返されます。
  249. production モードを無効にする (これはテスト時にしか行ってはいけません)
  250. と、例外についての詳細が返されるようになり、
  251. 例外メッセージや行番号、バックトレースがすべて返されます。
  252. </para>
  253. <para>
  254. production モードを無効にするには、次のようにします。
  255. </para>
  256. <programlisting language="php"><![CDATA[
  257. $server->setProduction(false);
  258. ]]></programlisting>
  259. <para>
  260. 再度有効にするには、true を渡します。
  261. </para>
  262. <programlisting language="php"><![CDATA[
  263. $server->setProduction(true);
  264. ]]></programlisting>
  265. <note>
  266. <title>production モードの無効化は慎重に!</title>
  267. <para>
  268. production モードを無効にするのは、開発時のみにすることを推奨します。
  269. 例外メッセージやバックトレースにはシステムに関する重大な情報が含まれる可能性があり、
  270. 外部からアクセスされることは好ましくありません。
  271. AMF はバイナリ形式ではありますが、その仕様は公開されています。
  272. つまり、誰でもメッセージを解読できる可能性があるということです。
  273. </para>
  274. </note>
  275. <para>
  276. もうひとつ、特に注意を要するのが PHP のエラーです。
  277. INI 設定 <emphasis>display_errors</emphasis> が有効になっていると、
  278. エラー報告レベルに応じてあらゆる PHP のエラーが直接出力されてしまいます。
  279. これは、AMF のレスポンスを壊してしまう可能性があります。
  280. 運用時には <emphasis>display_errors</emphasis> を無効にし、
  281. この問題を回避することを推奨します。
  282. </para>
  283. </sect2>
  284. <sect2 id="zend.amf.server.response">
  285. <title>AMF レスポンス</title>
  286. <para>
  287. レスポンスオブジェクトを操作したくなることもあるかもしれません。
  288. メッセージヘッダを追加したい場合などが考えられます。サーバの
  289. <methodname>handle()</methodname> メソッドはレスポンスオブジェクトを返すので、これが利用できます。
  290. </para>
  291. <example id="zend.amf.server.response.messageHeaderExample">
  292. <title>AMF レスポンスへのメッセージヘッダの追加</title>
  293. <para>
  294. この例では、'foo' という MessageHeader に値
  295. 'bar' を設定したものをレスポンスに追加してからそれを返します。
  296. </para>
  297. <programlisting language="php"><![CDATA[
  298. $response = $server->handle();
  299. $response->addAmfHeader(new Zend_Amf_Value_MessageHeader('foo', true, 'bar'))
  300. echo $response;
  301. ]]></programlisting>
  302. </example>
  303. </sect2>
  304. <sect2 id="zend.amf.server.typedobjects">
  305. <title>型付きオブジェクト</title>
  306. <para>
  307. <emphasis>SOAP</emphasis> と同様、
  308. AMF でもクライアントとサーバの間でオブジェクトをやりとりすることができます。
  309. これにより、クライアントとサーバの間での柔軟性と一貫性を確保することができます。
  310. </para>
  311. <para>
  312. <classname>Zend_Amf</classname> には、
  313. ActionScript と PHP オブジェクトを関連付けるための 3 つのメソッドが用意されています。
  314. </para>
  315. <itemizedlist>
  316. <listitem>
  317. <para>
  318. まず、サーバ側で明示的なバインドを行うには
  319. <methodname>setClassMap()</methodname> メソッドを使用します。
  320. 最初の引数は ActionScript クラス名で、2 番目の引数は関連付ける
  321. PHP クラス名となります。
  322. </para>
  323. <programlisting language="php"><![CDATA[
  324. // ActionScript クラス 'ContactVO' と PHP クラス 'Contact' を関連付けます
  325. $server->setClassMap('ContactVO', 'Contact');
  326. ]]></programlisting>
  327. </listitem>
  328. <listitem>
  329. <para>
  330. 次に、PHP クラス内で public プロパティ
  331. <varname>$_explicitType</varname> を設定する方法があります。
  332. ここには、関連付けたい ActionScript クラス名を指定します。
  333. </para>
  334. <programlisting language="php"><![CDATA[
  335. class Contact
  336. {
  337. public $_explicitType = 'ContactVO';
  338. }
  339. ]]></programlisting>
  340. </listitem>
  341. <listitem>
  342. <para>
  343. 3 番目の方法として、PHP クラスの public メソッド
  344. <methodname>getASClassName()</methodname> を使用することもできます。
  345. このメソッドは、適切な ActionScript クラスを返すようにしなければなりません。
  346. </para>
  347. <programlisting language="php"><![CDATA[
  348. class Contact
  349. {
  350. public function getASClassName()
  351. {
  352. return 'ContactVO';
  353. }
  354. }
  355. ]]></programlisting>
  356. </listitem>
  357. </itemizedlist>
  358. <para>
  359. サーバ側で ContactVO を作成したら、
  360. サーバオブジェクトに対応するクラスを AS3 で書かなければなりません。
  361. </para>
  362. <para>
  363. Flex プロジェクトの src フォルダを右クリックし、新規作成 ->
  364. ActionScript ファイルを選択します。ファイルに ContactVO
  365. という名前をつけて終了を押すと、新しいファイルがあらわれます。
  366. 次のコードをコピーして、クラスを作成しましょう。
  367. </para>
  368. <programlisting language="as"><![CDATA[
  369. package
  370. {
  371. [Bindable]
  372. [RemoteClass(alias="ContactVO")]
  373. public class ContactVO
  374. {
  375. public var id:int;
  376. public var firstname:String;
  377. public var lastname:String;
  378. public var email:String;
  379. public var mobile:String;
  380. public function ProductVO():void {
  381. }
  382. }
  383. }
  384. ]]></programlisting>
  385. <para>
  386. このクラスは、同名の PHP のクラスと構文的に同等となります。
  387. 変数名はまったく同じで、大文字小文字もあわせておかなければ正しく動作しません。
  388. このクラスでは、AS3 独特のメタタグが 2 つ用いられています。
  389. 最初のタグは bindable で、これは更新時に change イベントを発火させます。
  390. 2 番目のタグは RemoteClass で、このクラスがリモートオブジェクトを保持できること、
  391. そのエイリアス名が (ここでは) <emphasis>ContactVO</emphasis> であることを定義します。
  392. このタグに設定される値は、PHP のクラスと正確に一致していなければなりません。
  393. </para>
  394. <programlisting language="as"><![CDATA[
  395. [Bindable]
  396. private var myContact:ContactVO;
  397. private function getContactHandler(event:ResultEvent):void {
  398. myContact = ContactVO(event.result);
  399. }
  400. ]]></programlisting>
  401. <para>
  402. サービスコールの後の result イベントは即時に Flex の ContactVO にキャストされます。
  403. myContact にバインドされているすべての内容は、返された
  404. ContactVO データで更新されます。
  405. </para>
  406. </sect2>
  407. <sect2 id="zend.amf.server.flash">
  408. <title>サーバへの Flash からの接続</title>
  409. <para>
  410. <classname>Zend_Amf_Server</classname> に Flash プロジェクトから接続する方法は、
  411. Flex からの場合とは多少異なります。しかし、いったん接続してしまえば
  412. <classname>Zend_Amf_Server</classname> は flex の場合と同じように動作します。
  413. 次の例は Flex AS3 ファイルからでも使用できます。
  414. 同じ <classname>Zend_Amf_Server</classname> 設定ファイルを用い、
  415. World クラスを用いて接続します。
  416. </para>
  417. <para>
  418. Flash CS を開き、新規 Flash ファイル (ActionScript 3) を作成します。
  419. そのドキュメントに <filename>ZendExample.fla</filename> という名前をつけ、
  420. このサンプルを使用するフォルダに保存します。
  421. 次に、同じディレクトリに新規 AS3 ファイルを作成し、
  422. <filename>Main.as</filename> という名前をつけます。
  423. そして両方のファイルをエディタで開きます。
  424. これから、ドキュメントクラスを通じてふたつのファイルをつないできます。
  425. ZendExample を選択し、ステージ上でクリックします。
  426. ステージのプロパティパネルで、ドキュメントクラスを Main に変更します。
  427. これで、ActionScript ファイル <filename>Main.as</filename> が
  428. <filename>ZendExample.fla</filename> のユーザインターフェイスとつながります。
  429. Flash ファイル ZendExample を実行すると、
  430. <filename>Main.as</filename> クラスが実行されるようになるのです。
  431. 次に、AMF をコールする ActionScript を追加します。
  432. </para>
  433. <para>
  434. それでは、Main クラスを作成していきましょう。
  435. これを用いてデータをサーバに送信し、結果を表示します。
  436. 次のコードを <filename>Main.as</filename> にコピーしましょう。これから、
  437. このコードの中身を追いかけながら何をやっているのかを説明していきます。
  438. </para>
  439. <programlisting language="as"><![CDATA[
  440. package {
  441. import flash.display.MovieClip;
  442. import flash.events.*;
  443. import flash.net.NetConnection;
  444. import flash.net.Responder;
  445. public class Main extends MovieClip {
  446. private var gateway:String = "http://example.com/server.php";
  447. private var connection:NetConnection;
  448. private var responder:Responder;
  449. public function Main() {
  450. responder = new Responder(onResult, onFault);
  451. connection = new NetConnection;
  452. connection.connect(gateway);
  453. }
  454. public function onComplete( e:Event ):void{
  455. var params = "Sent to Server";
  456. connection.call("World.hello", responder, params);
  457. }
  458. private function onResult(result:Object):void {
  459. // Display the returned data
  460. trace(String(result));
  461. }
  462. private function onFault(fault:Object):void {
  463. trace(String(fault.description));
  464. }
  465. }
  466. }
  467. ]]></programlisting>
  468. <para>
  469. まず、さまざまな作業をするための ActionScript ライブラリをインポートする必要があります。
  470. ひとつめが NetConnection で、これはクライアントとサーバの間でパイプのような働きをします。
  471. もうひとつは Responder オブジェクトで、これはコールが成功したかどうかなどのサーバからの返り値を処理します。
  472. </para>
  473. <programlisting language="as"><![CDATA[
  474. import flash.net.NetConnection;
  475. import flash.net.Responder;
  476. ]]></programlisting>
  477. <para>
  478. クラスの中で 3 つの変数を用意します。これらがそれぞれ NetConnection、Responder
  479. そして <classname>Zend_Amf_Server</classname> へのゲートウェイ URL をあらわします。
  480. </para>
  481. <programlisting language="as"><![CDATA[
  482. private var gateway:String = "http://example.com/server.php";
  483. private var connection:NetConnection;
  484. private var responder:Responder;
  485. ]]></programlisting>
  486. <para>
  487. Main のコンストラクタでレスポンダを作成し、また
  488. <classname>Zend_Amf_Server</classname> エンドポイントへの新規接続も作成します。
  489. レスポンダでは、サーバからのレスポンスを処理するメソッドが 2 つ定義されています。
  490. わかりやすくするため、それぞれ onResult および onFault と名づけます。
  491. </para>
  492. <programlisting language="as"><![CDATA[
  493. responder = new Responder(onResult, onFault);
  494. connection = new NetConnection;
  495. connection.connect(gateway);
  496. ]]></programlisting>
  497. <para>
  498. onComplete 関数は、コンストラクタの処理が終わった直後に実行されます。
  499. ここで、データをサーバに送信します。
  500. <classname>Zend_Amf_Server</classname> World->hello 関数をコールするコードを 1 行追加しています。
  501. </para>
  502. <programlisting language="as"><![CDATA[
  503. connection.call("World.hello", responder, params);
  504. ]]></programlisting>
  505. <para>
  506. responder を作成した際に、サーバからのレスポンスを処理する関数として
  507. onResult と onFault を定義しました。サーバから正しい結果が返ってきたとき用の関数を追加します。
  508. 成功時のイベントハンドラは、サーバへの接続が正しく処理されるたびに毎回実行されます。
  509. </para>
  510. <programlisting language="as"><![CDATA[
  511. private function onResult(result:Object):void {
  512. // Display the returned data
  513. trace(String(result));
  514. }
  515. ]]></programlisting>
  516. <para>
  517. onFault 関数は、サーバから無効な結果が返ってきたときにコールされます。
  518. たとえば、サーバからエラーが返された場合、サーバへの URL が無効な場合、
  519. リモート側にサービスやメソッドが存在しない場合など、接続時に問題が発生した場合にコールされることになります。
  520. </para>
  521. <programlisting language="as"><![CDATA[
  522. private function onFault(fault:Object):void {
  523. trace(String(fault.description));
  524. }
  525. ]]></programlisting>
  526. <para>
  527. これで、ActionScript 内でのリモート接続処理は完成しました。
  528. ZendExample を実行すると、Zend Amf へ接続されるようになります。
  529. ここまでを振り返ってみましょう。まず最初にリモートサーバへの接続に必要な変数を追加し、
  530. サーバからのレスポンスを受け取ったときに使用するメソッドを定義し、
  531. そして最後に返された結果を <methodname>trace()</methodname> で出力しました。
  532. </para>
  533. </sect2>
  534. </sect1>
  535. <!--
  536. vim:se ts=4 sw=4 et:
  537. -->