1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20792 -->
4 <sect1 id="zend.json.server">
5 <title>Zend_Json_Server - JSON-RPCサーバー</title>
8 <classname>Zend_Json_Server</classname>は<ulink
9 url="http://groups.google.com/group/json-rpc/">JSON-RPC</ulink>
11 <ulink url="http://groups.google.com/group/json-rpc/web/json-rpc-1-2-proposal">バージョン 2 仕様</ulink>
13 <ulink url="http://json-rpc.org/wiki/specification">JSON-RPCバージョン 1 仕様</ulink>
15 それは、サービスのメタデータをサービス利用者に提供するために、
16 <ulink url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal">サービス
17 マッピング定義 (SMD) 仕様</ulink>の
18 <acronym>PHP</acronym>実装を提供します。
22 JSON-RPCは、軽量なリモート・プロシージャ呼出しプロトコルです。
23 そのプロトコルでは、<acronym>JSON</acronym>をそのメッセージのエンベロープのために利用します。
24 このJSON-RPC実装は<acronym>PHP</acronym>の<ulink
25 url="http://www.php.net/manual/ja/class.soapserver.php">SoapServer</ulink>
26 <acronym>API</acronym>に従います。
27 このことにより典型的状況では、簡単に下記のことができます:
31 <listitem><para>サーバーオブジェクトのインスタンス化</para></listitem>
32 <listitem><para>一つ以上の関数やクラス/オブジェクトをサーバーオブジェクトに配置</para></listitem>
33 <listitem><para>リクエストの handle()</para></listitem>
37 <classname>Zend_Json_Server</classname>は
38 どんな付属のクラスまたは関数でも<xref linkend="zend.server.reflection" />Reflectionを実行することを利用します。
39 また、SMDと実施するメソッド呼び出しのシグナチュアとの両方をビルドするためにその情報を使います。
40 そのように、それはどんな付属の関数またはクラス・メソッドでも完全な<acronym>PHP</acronym> docblock文書を最小限、持つ命令文です:
44 <listitem><para>パラメータとそれらで期待される変数の型の全て</para></listitem>
45 <listitem><para>戻り値変数の型</para></listitem>
49 <classname>Zend_Json_Server</classname>はこの時だけPOSTリクエストをリスンします;
50 幸いにも、この文書の時点では、ワイルドなJSON-RPC実装の大半は、
53 リクエストの処理だけではなく、サービスSMDの配信の両方で
54 同じサーバーエンドポイントを簡単に利用できるようにします。
57 <example id="zend.json.server.usage">
58 <title>Zend_Json_Server利用方法</title>
61 最初に、JSON-RPCサーバーによって公開したいクラスを定義しましょう。
62 そのクラスを 'Calculator' とし、
63 'add'、'subtract'、'multiply' 及び 'divide'メソッドを定義します:
66 <programlisting language="php"><![CDATA[
68 * Calculator - JSON-RPCを通じて公開するサンプル・クラス。
79 public function add($x, $y)
91 public function subtract($x, $y)
103 public function multiply($x, $y)
115 public function divide($x, $y)
123 それぞれのメソッドで戻り値のための項目だけでなく、
124 それぞれのパラメータとその型を示す項目を持つdocblockを持つことに注意してください。
125 それに関しては、Zend Frameworkで<classname>Zend_Json_Server</classname>や
126 その他のいずれのサーバー構成要素を利用するときでも、これは<emphasis>絶対重要</emphasis>です。
130 それでは、リクエストを処理するためのスクリプトを作成します:
133 <programlisting language="php"><![CDATA[
134 $server = new Zend_Json_Server();
136 // どのような機能が利用できるか示します:
137 $server->setClass('Calculator');
144 しかしながら、JSON-RPCクライアントがメソッドを自動検出できるように、
146 それは、<acronym>HTTP</acronym>がメソッドをリクエストすることを確定し、
147 それから、若干のサーバー・メタデータを指定することによって達成されます:
150 <programlisting language="php"><![CDATA[
151 $server = new Zend_Json_Server();
152 $server->setClass('Calculator');
154 if ('GET' == $_SERVER['REQUEST_METHOD']) {
155 // URLのエンドポイント及び使用するJSON-RPCのバージョンを示します:
156 $server->setTarget('/json-rpc.php')
157 ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
160 $smd = $server->getServiceMap();
163 header('Content-Type: application/json');
172 DojoツールキットでJSON-RPCサーバーを利用するなら、
173 その2つがきちんと相互作用することを確実にするために、
174 特別な互換性フラグをセットする必要もあります:
177 <programlisting language="php"><![CDATA[
178 $server = new Zend_Json_Server();
179 $server->setClass('Calculator');
181 if ('GET' == $_SERVER['REQUEST_METHOD']) {
182 $server->setTarget('/json-rpc.php')
183 ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
184 $smd = $server->getServiceMap();
187 $smd->setDojoCompatible(true);
189 header('Content-Type: application/json');
198 <sect2 id="zend.json.server.details">
202 <classname>Zend_Json_Server</classname>の機能の大半が
203 <xref linkend="zend.json.server.usage" />で説明されており、
207 <sect3 id="zend.json.server.details.zendjsonserver">
208 <title>Zend_Json_Server</title>
211 <classname>Zend_Json_Server</classname>は、
212 JSON-RPCを提供する中心的なクラスです;
219 <listitem><para><methodname>addFunction($function)</methodname>:
220 サーバーに関連するユーザーランド関数を指定します。
222 <listitem><para><methodname>setClass($class)</methodname>:
223 サーバーに関連するクラスまたはオブジェクトを指定します;
224 そのアイテムのすべてのpublicメソッドは、
227 <listitem><para><code>fault($fault = null, $code = 404, $data =
229 <classname>Zend_Json_Server_Error</classname>オブジェクトを生成して返します。
231 <listitem><para><methodname>handle($request = false)</methodname>:
233 任意で、利用するための<classname>Zend_Json_Server_Request</classname>オブジェクトを渡します。
236 <listitem><para><methodname>getFunctions()</methodname>:
239 <listitem><para><code>setRequest(Zend_Json_Server_Request
241 サーバーのために使用するためのリクエストオブジェクトを指定します。
243 <listitem><para><methodname>getRequest()</methodname>:
244 サーバーで使われるリクエストオブジェクトを取得します。
246 <listitem><para><code>setResponse(Zend_Json_Server_Response
248 サーバーのために使用するためのレスポンスオブジェクトを設定します。
250 <listitem><para><methodname>getResponse()</methodname>:
251 サーバーで使われるレスポンスオブジェクトを取得します。
253 <listitem><para><methodname>setAutoEmitResponse($flag)</methodname>:
254 サーバーがレスポンスとすべてのヘッダを自動的に送り出さなければならないかどうか示します;
255 デフォルトで、これは <constant>TRUE</constant> です。
257 <listitem><para><methodname>autoEmitResponse()</methodname>:
258 レスポンスの自動送出が使用可能かどうか決定します。
260 <listitem><para><methodname>getServiceMap()</methodname>:
261 <classname>Zend_Json_Server_Smd</classname>オブジェクトの形で
267 <sect3 id="zend.json.server.details.zendjsonserverrequest">
268 <title>Zend_Json_Server_Request</title>
272 <classname>Zend_Json_Server_Request</classname>オブジェクトにカプセル化されます。
273 このオブジェクトによって、リクエストIDやパラメータ、JSON-RPC仕様のバージョンを含む
274 JSON-RPCリクエストの必要な部分を設定できます。
275 それには<acronym>JSON</acronym>または一組のオプションによってそれ自体をロードする能力があって、
276 それ自体を<methodname>toJson()</methodname>メソッドにより<acronym>JSON</acronym>として翻訳できます。
280 リクエスト・オブジェクトでは、以下のメソッドを利用できます:
284 <listitem><para><methodname>setOptions(array $options)</methodname>:
286 <varname>$options</varname>は、どの 'set' メソッドにもマッチするキーを含むでしょう:
287 <methodname>setParams()</methodname>、<methodname>setMethod()</methodname>、
288 <methodname>setId()</methodname>及び<methodname>setVersion()</methodname>
290 <listitem><para><methodname>addParam($value, $key = null)</methodname>:
291 メソッド呼び出しで使うパラメータを追加します。
292 パラメータは値そのものか、パラメータ名を任意に含むことができます。
294 <listitem><para><methodname>addParams(array $params)</methodname>:
296 <methodname>addParam()</methodname>の代わりになります。
298 <listitem><para><methodname>setParams(array $params)</methodname>:
302 <listitem><para><methodname>getParam($index)</methodname>:
305 <listitem><para><methodname>getParams()</methodname>:
308 <listitem><para><methodname>setMethod($name)</methodname>:
311 <listitem><para><methodname>getMethod()</methodname>:
314 <listitem><para><methodname>isMethodError()</methodname>:
315 リクエストが異常で、エラーに終わるかどうか決定します。
317 <listitem><para><methodname>setId($name)</methodname>:
318 リクエスト識別子(クライアントでレスポンスにリクエストにマッチすることに使われる)をセットします。
320 <listitem><para><methodname>getId()</methodname>:
323 <listitem><para><methodname>setVersion($version)</methodname>:
324 リクエストが適合するJSON-RPC仕様バージョンを設定します。
325 おそらく '1.0' かまたは '2.0' のどちらかです。
327 <listitem><para><methodname>getVersion()</methodname>:
328 リクエストで使われるJSON-RPC仕様バージョンを取得します。
330 <listitem><para><methodname>loadJson($json)</methodname>:
331 <acronym>JSON</acronym>文字列からリクエストオブジェクトを読み込みます。
333 <listitem><para><methodname>toJson()</methodname>:
334 リクエストを<acronym>JSON</acronym>ストリングに翻訳します。
339 <acronym>HTTP</acronym>に特有のバージョンは、
340 <classname>Zend_Json_Server_Request_Http</classname>を通して利用できます。
341 このクラスは<code>php://input</code>を通じてリクエストを取得し、
342 <methodname>getRawJson()</methodname>メソッドを通じて生の<acronym>JSON</acronym>へのアクセスを可能にします。
346 <sect3 id="zend.json.server.details.zendjsonserverresponse">
347 <title>Zend_Json_Server_Response</title>
350 JSON-RPCレスポンス・ペイロードは、
351 <classname>Zend_Json_Server_Response</classname>オブジェクトにカプセル化されます。
353 リクエストの戻り値、レスポンスがエラーかどうか、
354 リクエスト識別子、レスポンスが従うJSON-RPC仕様バージョン、
355 そして任意にサービス・マップをセットできます。
359 レスポンス・オブジェクトでは、以下のメソッドを利用できます:
363 <listitem><para><methodname>setResult($value)</methodname>:
366 <listitem><para><methodname>getResult()</methodname>:
369 <listitem><para><code>setError(Zend_Json_Server_Error
372 設定すると、<acronym>JSON</acronym>にシリアライズ化するとき、これがレスポンスとして使われます。
374 <listitem><para><methodname>getError()</methodname>:
375 もしあれば、エラーオブジェクトを取得します。
377 <listitem><para><methodname>isError()</methodname>:
378 レスポンスがエラー・レスポンスであるかどうか。
380 <listitem><para><methodname>setId($name)</methodname>:
382 (クライアントはオリジナルのリクエストでレスポンスにマッチするかもしれません)
385 <listitem><para><methodname>getId()</methodname>:
388 <listitem><para><methodname>setVersion($version)</methodname>:
389 レスポンスが適合するJSON-RPCバージョンを設定します。
391 <listitem><para><methodname>getVersion()</methodname>:
392 レスポンスが適合するJSON-RPCバージョンを取得します。
394 <listitem><para><methodname>toJson()</methodname>:
395 レスポンスがエラー・レスポンスで、エラー・オブジェクトをシリアライズ化するならば、
396 <acronym>JSON</acronym>に対するレスポンスをシリアライズ化します。
398 <listitem><para><methodname>setServiceMap($serviceMap)</methodname>:
399 サービス・マップ・オブジェクトをレスポンスに設定します。
401 <listitem><para><methodname>getServiceMap()</methodname>:
402 もしあれば、サービス・マップ・オブジェクトを取得します。
407 <acronym>HTTP</acronym>に依存したバージョンは、
408 <classname>Zend_Json_Server_Response_Http</classname>を通じて利用できます。
409 このクラスは<acronym>JSON</acronym>としてレスポンスをシリアライズ化するだけでなく、
410 適切な<acronym>HTTP</acronym>ヘッダを送ります。
414 <sect3 id="zend.json.server.details.zendjsonservererror">
415 <title>Zend_Json_Server_Error</title>
418 JSON-RPCには、エラー状況を報告するために、特別なフォーマットがあります。
419 エラーはすべて、最小限、エラー・メッセージとエラーコードを用意する必要があります;
420 任意に、追加のデータ(例えばbacktrace)を用意できます。
425 <ulink url="http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php">
426 XML-RPC EPIプロジェクト</ulink>によって推奨されるコードに由来します。
427 <classname>Zend_Json_Server</classname>は、エラー状態に基づくコードを適切に割り当てます。
428 アプリケーション例外のためには、コード '-32000' が使われます。
432 <classname>Zend_Json_Server_Error</classname>
437 <listitem><para><methodname>setCode($code)</methodname>:
439 認められたXML-RPCエラーコード範囲にそのコードがないならば、
442 <listitem><para><methodname>getCode()</methodname>:
445 <listitem><para><methodname>setMessage($message)</methodname>:
448 <listitem><para><methodname>getMessage()</methodname>:
451 <listitem><para><methodname>setData($data)</methodname>:
453 エラーを制限する補助データをさらにセットします。
455 <listitem><para><methodname>getData()</methodname>:
456 現行のエラー補助データをいずれも取得します。
458 <listitem><para><methodname>toArray()</methodname>:
460 配列は 'code'や'message'及び'data'キーを含むでしょう。
462 <listitem><para><methodname>toJson()</methodname>:
463 エラーをJSON-RPCエラー表現にキャストします。
468 <sect3 id="zend.json.server.details.zendjsonserversmd">
469 <title>Zend_Json_Server_Smd</title>
473 特定のウェブ・サービスとクライアントが相互作用できる方法を定義する<acronym>JSON</acronym>スキーマ、を表します。
475 <ulink url="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal">
476 仕様</ulink>は正式にまだ批准されませんでした、
477 しかし、それは他のJSON-RPC利用者のクライアントだけでなく、
478 Dojoツールキットの範囲内ですでに使用中です。
482 最も基本的には、サービス・マッピング記述は、トランスポート(POST、GET、<acronym>TCP</acronym>/IP、その他)
483 リクエスト・エンベロープ・タイプ(通常、サーバーのプロトコルに基づきます)、
484 サービスプロバイダのターゲット<acronym>URL</acronym>、
485 そして利用できるサービスマップのメソッドを示します。
486 JSON-RPCの場合、サービス・マップは利用できるメソッドのリストです、
487 そしてそれは、各々のメソッドの期待される戻り値タイプだけでなく、
488 利用できるパラメータとタイプを文書化します。
492 <classname>Zend_Json_Server_Smd</classname>は、
493 サービス・マップをビルドするオブジェクト指向方法を準備します。
494 最も基本的には、ミューテータを用いてサービスを記述しているメタデータをそれに渡して、
500 一般的に<classname>Zend_Json_Server_Smd_Service</classname>のインスタンスです;
501 <classname>Zend_Json_Server_Smd</classname>の
502 いろいろなサービス・ミューテータへの配列としてすべての情報を渡すこともできます、
503 そして、それはサービス・オブジェクトのインスタンスを生成します。
504 サービス・オブジェクトは、サービス名(一般的に関数またはメソッド名)、
505 パラメータ(名前、型と位置)や戻り値の型のような情報を含みます。
507 各々のサービスはそれ自身のターゲットとエンベロープを任意に持つことができます。
511 付属のクラスと関数のreflectionを用いて、
512 <classname>Zend_Json_Server</classname>は舞台裏ですべてを実際に行ないます;
513 クラスと関数自身への参照で提供することができないカスタム機能を準備する必要がある場合だけ、
514 あなた自身のサービス・マップを生成しなければなりません。
518 <classname>Zend_Json_Server_Smd</classname>での利用可能なメソッドを含みます:
522 <listitem><para><methodname>setOptions(array $options)</methodname>:
523 オプション配列からSMDオブジェクトをセットアップします。
524 ミューテーターのすべてを、キーとして使うことができます。
527 <listitem><para><methodname>setTransport($transport)</methodname>:
528 サービスにアクセスするために使われるトランスポートを設定します;
529 現行では POST だけがサポートされます。
531 <listitem><para><methodname>getTransport()</methodname>:
532 現行のサービストランスポートを取得します。
534 <listitem><para><methodname>setEnvelope($envelopeType)</methodname>:
535 サービスにアクセスするために使われるであろうリクエスト・エンベロープを設定します。
537 <constant>Zend_Json_Server_Smd::ENV_JSONRPC_1</constant>及び
538 <constant>Zend_Json_Server_Smd::ENV_JSONRPC_2</constant>をサポートします。
540 <listitem><para><methodname>getEnvelope()</methodname>:
541 現行のリクエスト・エンベロープを取得します。
543 <listitem><para><methodname>setContentType($type)</methodname>:
544 リクエストが使うであろうコンテンツタイプを設定します。
545 (デフォルトでは、これは 'application/json' です)
547 <listitem><para><methodname>getContentType()</methodname>:
548 サービスにリクエストするための、現行のコンテンツタイプを取得します。
550 <listitem><para><methodname>setTarget($target)</methodname>:
551 サービスのための<acronym>URL</acronym>エンドポイントを設定します。
553 <listitem><para><methodname>getTarget()</methodname>:
554 サービスのための<acronym>URL</acronym>エンドポイントを取得します。
556 <listitem><para><methodname>setId($id)</methodname>:
557 一般的に、(ターゲットと同じく)これはサービスの<acronym>URL</acronym>エンドポイントです。
559 <listitem><para><methodname>getId()</methodname>:
561 (一般的に、サービスの<acronym>URL</acronym>エンドポイントです)
563 <listitem><para><methodname>setDescription($description)</methodname>:
565 (一般的に、サービスの目的を説明する物語の情報です)
567 <listitem><para><methodname>getDescription()</methodname>:
570 <listitem><para><methodname>setDojoCompatible($flag)</methodname>:
571 SMDがDojoツールキットと互換かどうか示すフラグを設定します。
572 <constant>TRUE</constant> の場合、生成された<acronym>JSON</acronym> SMDは、
573 DojoのJSON-RPCクライアントが期待する形式に従ってフォーマットされます。
575 <listitem><para><methodname>isDojoCompatible()</methodname>:
577 (デフォルトでは <constant>FALSE</constant> です)
579 <listitem><para><methodname>addService($service)</methodname>:
581 <classname>Zend_Json_Server_Smd_Service</classname>のコンストラクタに渡す情報の配列か、
584 <listitem><para><methodname>addServices(array $services)</methodname>:
587 <listitem><para><methodname>setServices(array $services)</methodname>:
589 以前に設定されたサービスを全て上書きします。
591 <listitem><para><methodname>getService($name)</methodname>:
594 <listitem><para><methodname>getServices()</methodname>:
597 <listitem><para><methodname>removeService($name)</methodname>:
600 <listitem><para><methodname>toArray()</methodname>:
603 <listitem><para><methodname>toDojoArray()</methodname>:
604 サービスマップをDojoツールキット互換の配列にキャストします。
606 <listitem><para><methodname>toJson()</methodname>:
607 サービスマップを<acronym>JSON</acronym>表現にキャストします。
612 <classname>Zend_Json_Server_Smd_Service</classname>には下記のメソッドがあります:
616 <listitem><para><methodname>setOptions(array $options)</methodname>:
618 どのミューテーター(メソッドは 'set' で始まります)でもキーとして使われ、
621 <listitem><para><methodname>setName($name)</methodname>:
625 <listitem><para><methodname>getName()</methodname>:
628 <listitem><para><methodname>setTransport($transport)</methodname>:
630 (現行では、<classname>Zend_Json_Server_Smd</classname>によりサポートされる
633 <listitem><para><methodname>getTransport()</methodname>: Retrieve the
634 current transport.</para></listitem>
635 <listitem><para><methodname>setTarget($target)</methodname>:
636 サービスの<acronym>URL</acronym>エンドポイントを設定します。
637 (一般的には、サービスが付与される全体的なSMDとこれは同じです。)
639 <listitem><para><methodname>getTarget()</methodname>:
640 サービスの<acronym>URL</acronym>エンドポイントを取得します。
642 <listitem><para><methodname>setEnvelope($envelopeType)</methodname>:
643 サービスのエンベロープタイプを設定します。
644 (現行では、<classname>Zend_Json_Server_Smd</classname>によりサポートされる
647 <listitem><para><methodname>getEnvelope()</methodname>:
648 サービスのエンベロープタイプを取得します。
650 <listitem><para><code>addParam($type, array $options = array(),
651 $order = null)</code>:
653 デフォルトで、パラメータ型だけは必要です。
654 しかしながら、下記のオプションのように、指令を与えたいかもしれません:
657 <listitem><para><emphasis>name</emphasis>:
660 <listitem><para><emphasis>optional</emphasis>:
663 <listitem><para><emphasis>default</emphasis>:
666 <listitem><para><emphasis>description</emphasis>:
671 <listitem><para><methodname>addParams(array $params)</methodname>:
673 各々のパラメータは、最小限、パラメータ型を記述する '型' 、
674 さらに任意で '順序' キーを含む連想配列でなければなりません。
675 その他の全てのキーは<methodname>addOption()</methodname>に
676 <varname>$options</varname>として渡されます。
678 <listitem><para><methodname>setParams(array $params)</methodname>:
682 <listitem><para><methodname>getParams()</methodname>:
683 現行で設定されているパラメータを全て取得します。
685 <listitem><para><methodname>setReturn($type)</methodname>:
688 <listitem><para><methodname>getReturn()</methodname>:
691 <listitem><para><methodname>toArray()</methodname>:
694 <listitem><para><methodname>toJson()</methodname>:
695 サービスを<acronym>JSON</acronym>表現にキャストします。