File: Zend_Rest_Client.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (221 lines) | stat: -rw-r--r-- 9,385 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.rest.client">
    <title>Zend_Rest_Client</title>

    <sect2 id="zend.rest.client.introduction">
        <title>Einführung</title>

        <para>
            Die Verwendung von <classname>Zend_Rest_Client</classname> ist sehr ähnlich der
            Verwendung von <code>SoapClient</code> Objekten (<ulink
                url="http://www.php.net/soap">SOAP Web Service Erweiterung</ulink>). Man kann
            einfach die REST Service Prozeduren als <classname>Zend_Rest_Client</classname> Methoden
            aufrufen. Spezifiziere die komplette Adresse des Services im Constructor von
            <classname>Zend_Rest_Client</classname>.
        </para>

        <example id="zend.rest.client.introduction.example-1">
            <title>Eine Basis REST Anfrage</title>

            <programlisting language="php"><![CDATA[
/**
 * Verbinden zum framework.zend.com Server und eine Begrüßung empfangen
 */
$client = new Zend_Rest_Client('http://framework.zend.com/rest');

echo $client->sayHello('Davey', 'Day')->get(); // "Servus Davey, guten Tag"
]]></programlisting>
        </example>

        <note>
            <title>Unterschiede im Aufruf</title>

            <para>
                <classname>Zend_Rest_Client</classname> versucht, dass die entfernten Methoden, so
                weit wie möglich, wie die nativen Methoden aussehen, wobei der einzige Unterschied
                darin besteht, dass der Methodenaufruf mit <methodname>get()</methodname>,
                <methodname>post()</methodname>, <methodname>put()</methodname> oder
                <methodname>delete()</methodname> erfolgen muß. Dieser Aufruf kann entweder über
                Methoden Verkettung oder in eigenen Methodenaufrufen erfolgen:
            </para>

            <programlisting language="php"><![CDATA[
$client->sayHello('Davey', 'Tag');
echo $client->get();
]]></programlisting>
        </note>
    </sect2>

    <sect2 id="zend.rest.client.return">
        <title>Antworten</title>

        <para>
            Alle Anfragen die über <classname>Zend_Rest_Client</classname> gemacht wurden,
            liefern ein <classname>Zend_Rest_Client_Response</classname> Objekt zurück. Dieses
            Objekt hat viele Eigenschaften, was es einfacher macht, auf die Ergebnisse zuzugreifen.
        </para>

        <para>
            Wenn ein Service auf <classname>Zend_Rest_Server</classname> basiert, kann
            <classname>Zend_Rest_Client</classname> einige Annahmen über die Antwort treffen,
            inklusive dem Antwort Status (erfolgreich oder fehlerhaft) und den Rückgabetyp.
        </para>

        <example id="zend.rest.client.return.example-1">
            <title>Antwort Status</title>

            <programlisting language="php"><![CDATA[
$result = $client->sayHello('Davey', 'Tag')->get();

if ($result->isSuccess()) {
    echo $result; // "Hallo Davey, guten Tag"
}
]]></programlisting>
        </example>

        <para>
            Im obigen Beispiel kann man sehen, dass das Ergebnis der Anfrage als Objekt verwendet
            wird, um <methodname>isSuccess()</methodname> aufzurufen. Mithilfe der magischen
            <methodname>__toString()</methodname>-Methode kann man das Objekt bzw. das Ergebnis
            ausgeben (<code>echo</code>). <classname>Zend_Rest_Client_Response</classname> erlaubt
            die Ausgabe jedes skalaren Wertes. Für komplexe Typen, kann entweder die Array- oder die
            Objektschreibweise verwendet werden.
        </para>

        <para>
            Wenn trotzdem ein Service abgefragt wird, der nicht
            <classname>Zend_Rest_Server</classname> verwendet, wird sich das
            <classname>Zend_Rest_Client_Response</classname> Objekt mehr wie ein
            <code>SimpleXMLElement</code> verhalten. Um die Dinge trotzdem einfacher zu gestalten,
            wird das <acronym>XML</acronym> automatisch abgefragt, indem XPath verwendet wird, wenn
            die Eigenschaft nicht von direkter Abstammung des Dokument Root-Elements ist.
            Zusätzlich, wenn auf eine Eigenschaft als Methode zugegriffen wird, empfängt man den
            <acronym>PHP</acronym> Wert für das Objekt, oder ein Array mit den
            <acronym>PHP</acronym> Wert Ergebnissen.
        </para>

        <example id="zend.rest.client.return.example-2">
            <title>Technorati's REST Service verwenden</title>

            <programlisting language="php"><![CDATA[
$technorati = new Zend_Rest_Client('http://api.technorati.com/bloginfo');
$technorati->key($key);
$technorati->url('http://pixelated-dreams.com');
$result = $technorati->get();
echo $result->firstname() .' '. $result->lastname();
]]></programlisting>
        </example>

        <example id="zend.rest.client.return.example-3">
            <title>Beispiel Technorati Antwort</title>

            <programlisting language="xml"><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<!-- generator="Technorati API version 1.0 /bloginfo" -->
<!DOCTYPE tapi PUBLIC "-//Technorati, Inc.//DTD TAPI 0.02//EN"
                      "http://api.technorati.com/dtd/tapi-002.xml">
<tapi version="1.0">
    <document>
        <result>
            <url>http://pixelated-dreams.com</url>
            <weblog>
                <name>Pixelated Dreams</name>
                <url>http://pixelated-dreams.com</url>
                <author>
                    <username>DShafik</username>
                    <firstname>Davey</firstname>
                    <lastname>Shafik</lastname>
                </author>
                <rssurl>
                    http://pixelated-dreams.com/feeds/index.rss2
                </rssurl>
                <atomurl>
                    http://pixelated-dreams.com/feeds/atom.xml
                </atomurl>
                <inboundblogs>44</inboundblogs>
                <inboundlinks>218</inboundlinks>
                <lastupdate>2006-04-26 04:36:36 GMT</lastupdate>
                <rank>60635</rank>
            </weblog>
            <inboundblogs>44</inboundblogs>
            <inboundlinks>218</inboundlinks>
        </result>
    </document>
</tapi>
]]></programlisting>
        </example>

        <para>
            Hier greifen wir auf die <code>firstname</code> und <code>lastname</code> Eigenschaften
            zu. Selbst wenn diese keine Top-Level Elemente sind, werden Sie automatisch
            zurückgegeben, wenn auf sie durch ihren Namen zugegriffen wird.
        </para>

        <note>
            <title>Mehrere Elemente</title>

            <para>
                Wenn beim Zugriff, über einen Namen, mehrere Elemente mit demselben Namen gefunden
                werden, wird ein Array von SimpleXML-Elementen zurückgegeben. Beim Zugriff über die
                Methodenschreibweise wird ein Array von <acronym>PHP</acronym> Werten zurückgegeben.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.rest.client.args">
        <title>Anfrage Argumente</title>

        <para>
            Wenn man eine Anfrage an einen Server sendet, welcher nicht auf
            <classname>Zend_Rest_Server</classname> basiert, sind die Chancen groß, dass man mehrere
            Argumente mit der Anfrage senden muß. Das wird durchgeführt, indem man eine Methode mit
            dem Namen des Arguments aufruft und den Wert, als das erste (und einzige) Argument
            übergibt. Jeder dieser Methodenaufrufe, gibt das Objekt selbst zurück, was Verkettung
            oder "flüssige" Verwendung erlaubt. Der erste Aufruf, oder das erste Argument, das
            übergeben wird, wenn man mehr als ein Argument übergeben will, wird immer als die
            Methode angenommen wenn ein <classname>Zend_Rest_Server</classname> Service aufgerufen
            wird.
        </para>

        <example id="zend.rest.client.args.example-1">
            <title>Anfrage Argumente setzen</title>

            <programlisting language="php"><![CDATA[
$client = new Zend_Rest_Client('http://example.org/rest');

$client->arg('value1');
$client->arg2('value2');
$client->get();

// oder

$client->arg('value1')->arg2('value2')->get();
]]></programlisting>
        </example>

        <para>
            Beide Varianten im obigen Beispiel, ergeben die folgenden get-Argumente:
            <code>?method=arg&amp;arg1=value1&amp;arg=value1&amp;arg2=value2</code>
        </para>

        <para>
            Es gilt zu bemerken, dass der erste Aufruf von <code>$client->arg('value1');</code> in
            beidem resultiert: <code>method=arg&amp;arg1=value1</code> und <code>arg=value1</code>.
            Es ist so, dass <classname>Zend_Rest_Server</classname> die Anfrage korrekt versteht,
            ohne dass vordefiniertes Wissen über das Service benötigt wird.
        </para>

        <warning>
            <title>Striktheit von Zend_Rest_Client</title>

            <para>
                Jeder REST Service der strikt in seinen Argumenten ist, die er empfängt, wird wegen
                dem oben beschriebenen Verhalten bei der Verwendung von
                <classname>Zend_Rest_Client</classname> fehlschlagen. Das ist keine gewöhnliche
                Praxis und sollte keine Probleme verursachen.
            </para>
        </warning>
    </sect2>
</sect1>