1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20854 -->
4 <sect1 id="zend.rest.client">
5 <title>Zend_Rest_Client</title>
7 <sect2 id="zend.rest.client.introduction">
11 <classname>Zend_Rest_Client</classname> の使用法は、
12 <code>SoapClient</code> オブジェクト (<ulink
13 url="http://www.php.net/soap">SOAP ウェブサービス拡張モジュール</ulink>)
14 の使用法と非常によく似ています。REST サービスのプロシージャは、簡単に
15 <classname>Zend_Rest_Client</classname> のメソッドとしてコールできます。
16 まず、そのサービスのアドレスを <classname>Zend_Rest_Client</classname> のコンストラクタに指定します。
19 <example id="zend.rest.client.introduction.example-1">
20 <title>基本的な REST リクエスト</title>
22 <programlisting language="php"><![CDATA[
24 * framework.zend.com サーバに接続し、挨拶を受け取ります
26 $client = new Zend_Rest_Client('http://framework.zend.com/rest');
28 echo $client->sayHello('Davey', 'Day')->get(); // "Hello Davey, Good Day"
33 <title>コール方法の違い</title>
36 <classname>Zend_Rest_Client</classname> は、
37 リモートメソッドのコールをできるだけネイティブなメソッドと同様に行おうとします。
38 唯一の違いは、続けて <methodname>get()</methodname> か <methodname>post()</methodname>、
39 <methodname>put()</methodname> あるいは <methodname>delete()</methodname>
40 のいずれかのメソッドをコールしなければならないということです。
41 これは、メソッドの連結で行ってもかまいませんし、
42 独立したメソッドコールにしてもかまいません。
45 <programlisting language="php"><![CDATA[
46 $client->sayHello('Davey', 'Day');
52 <sect2 id="zend.rest.client.return">
56 <classname>Zend_Rest_Client</classname> を使用して行ったリクエストは、すべて
57 <classname>Zend_Rest_Client_Response</classname> オブジェクトを返します。
58 このオブジェクトには多くのプロパティがあり、結果に簡単にアクセスできます。
62 <classname>Zend_Rest_Server</classname> に基づくサービスにアクセスした場合には、
63 <classname>Zend_Rest_Client</classname> は結果についていくつかの前提条件を想定しています。
64 たとえばレスポンスステータス (成功あるいは失敗) や返り値の型などです。
67 <example id="zend.rest.client.return.example-1">
68 <title>レスポンスステータス</title>
70 <programlisting language="php"><![CDATA[
71 $result = $client->sayHello('Davey', 'Day')->get();
73 if ($result->isSuccess()) {
74 echo $result; // "Hello Davey, Good Day"
80 上の例で、リクエストの結果をオブジェクトとして扱い、
81 <methodname>isSuccess()</methodname> をコールしていることがごらんいただけるでしょう。
82 また、<methodname>__toString()</methodname> をサポートしているため、
83 単に <code>echo</code> とするだけでオブジェクトの結果を取得できます。
84 <classname>Zend_Rest_Client_Response</classname> は、任意のスカラー値を
85 echo することが可能です。複雑な形式の場合は、
86 配列記法あるいはオブジェクト記法が使用できます。
90 しかし、<classname>Zend_Rest_Server</classname>
91 を使用していないサービスに問い合わせたいこともあるでしょう。このような場合、
92 <classname>Zend_Rest_Client_Response</classname> オブジェクトは
93 <code>SimpleXMLElement</code> と同様の振る舞いをします。
94 しかし、より簡単に処理するため、プロパティがルート要素の直下にない場合には
95 自動的に XPath で <acronym>XML</acronym> を探すようにしています。さらに、
96 プロパティに対してメソッドとしてアクセスすると、
97 <acronym>PHP</acronym> の値あるいは値の配列としてそのオブジェクトを取得できます。
100 <example id="zend.rest.client.return.example-2">
101 <title>Technorati の Rest サービスの使用</title>
103 <programlisting language="php"><![CDATA[
104 $technorati = new Zend_Rest_Client('http://api.technorati.com/bloginfo');
105 $technorati->key($key);
106 $technorati->url('http://pixelated-dreams.com');
107 $result = $technorati->get();
108 echo $result->firstname() .' '. $result->lastname();
112 <example id="zend.rest.client.return.example-3">
113 <title>Technorati からのレスポンスの例</title>
115 <programlisting language="xml"><![CDATA[
116 <?xml version="1.0" encoding="utf-8"?>
117 <!-- generator="Technorati API version 1.0 /bloginfo" -->
118 <!DOCTYPE tapi PUBLIC "-//Technorati, Inc.//DTD TAPI 0.02//EN"
119 "http://api.technorati.com/dtd/tapi-002.xml">
123 <url>http://pixelated-dreams.com</url>
125 <name>Pixelated Dreams</name>
126 <url>http://pixelated-dreams.com</url>
128 <username>DShafik</username>
129 <firstname>Davey</firstname>
130 <lastname>Shafik</lastname>
133 http://pixelated-dreams.com/feeds/index.rss2
136 http://pixelated-dreams.com/feeds/atom.xml
138 <inboundblogs>44</inboundblogs>
139 <inboundlinks>218</inboundlinks>
140 <lastupdate>2006-04-26 04:36:36 GMT</lastupdate>
143 <inboundblogs>44</inboundblogs>
144 <inboundlinks>218</inboundlinks>
152 ここで、<code>firstname</code> や
153 <code>lastname</code> といったプロパティにアクセスできます。
154 これらはトップレベル要素ではありませんが、
155 名前を指定するだけで自動的に取得できます。
162 名前でアクセスしているときにもし複数の項目が見つかったら、
163 SimpleXMLElements の配列を返します。メソッド記法でアクセスすると、
164 <acronym>PHP</acronym> の値の配列を返します。
169 <sect2 id="zend.rest.client.args">
170 <title>リクエストの引数</title>
173 <classname>Zend_Rest_Server</classname> ベースのサービスにリクエストを送るのではない場合は、
174 リクエストの際に複数の引数を指定する必要があります。
175 これを行うには、引数名と同じ名前のメソッドをコールし、
176 その最初の (そして唯一の) 引数として値を指定します。
177 これらのメソッドコールはそのオブジェクト自身を返すので、
178 メソッドを連結する "流れるような" 形式で使用できます。
179 最初のコール (あるいは複数の引数を指定した場合の最初の引数)
180 は常に、<classname>Zend_Rest_Server</classname>
181 サービスをコールする際のメソッドとみなされます。
184 <example id="zend.rest.client.args.example-1">
185 <title>リクエストの引数の設定</title>
187 <programlisting language="php"><![CDATA[
188 $client = new Zend_Rest_Client('http://example.org/rest');
190 $client->arg('value1');
191 $client->arg2('value2');
196 $client->arg('value1')->arg2('value2')->get();
201 上の例の二通りの方法はいずれも、次のような get 引数となります。
202 <code>?method=arg&arg1=value1&arg=value1&arg2=value2</code>
206 最初の <code>$client->arg('value1');</code> のコールが
207 <code>method=arg&arg1=value1</code> および <code>arg=value1</code>
208 の二通りの結果となることにお気づきでしょう。これによって、
209 <classname>Zend_Rest_Server</classname> がリクエストを適切に理解できるようになるのです。
210 そのサービスを使用するにあたっての前提知識を必要としなくなります。
214 <title>Zend_Rest_Client の厳格性</title>
217 受け取る引数について厳格な REST サービスでは、
218 <classname>Zend_Rest_Client</classname> の使用に失敗することがあります。
220 これはそう頻繁に起こることではないので、特に問題とはならないでしょう。