| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.xmlrpc.client">
- <title>Zend_XmlRpc_Client</title>
- <sect2 id="zend.xmlrpc.client.introduction">
- <title>Einführung</title>
- <para>
- Zend Framework bietet Unterstützung, als Client - durch das
- <classname>Zend_XmlRpc_Client</classname> Paket - entfernte <acronym>XML-RPC</acronym>
- Dienste zu nutzen. Seine wichtigsten Möglichkeiten beinhalten das automatische
- Umwandeln zwischen <acronym>PHP</acronym> und <acronym>XML-RPC</acronym>, ein Server
- Proxy-Objekt und den Zugriff auf Server-Prüfungsmöglichkeiten.
- </para>
- </sect2>
- <sect2 id="zend.xmlrpc.client.method-calls">
- <title>Methodenaufrufe</title>
- <para>
- Der Konstruktor von <classname>Zend_XmlRpc_Client</classname> erhält den
- <acronym>URL</acronym> des Endpunktes des entfernten <acronym>XML-RPC</acronym> Server
- als ersten Parameter. Die zurückgegebene Instanz kann genutzt werden, um eine beliebige
- Anzahl von entfernten Methoden (des Endpunktes) aufzurufen.
- </para>
- <para>
- Um eine entfernte Methode mittels des <acronym>XML-RPC</acronym> Clients aufzurufen,
- muss man den Client instanzieren und dessen Methode <methodname>call()</methodname>
- aufrufen. Das hierunter gegebene Codebeispiel demonstriert den
- <acronym>XML-RPC</acronym> Server der Zend Framework Webseite. Es kann benutzen, um
- <classname>Zend_XmlRpc</classname>-Komponenten zu testen oder auszuprobieren.
- </para>
- <example id="zend.xmlrpc.client.method-calls.example-1">
- <title>XML-RPC Methodenaufruf</title>
- <programlisting language="php"><![CDATA[
- $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
- echo $client->call('test.sayHello');
- // hello
- ]]></programlisting>
- </example>
- <para>
- Der - durch den Aufruf einer entfernten Methode - zurückgegebene, typenlose
- <acronym>XML-RPC</acronym> Wert wird automatisch zu dessen nativen
- <acronym>PHP</acronym> Äquivalent umgeformt. In obigem Beispiel wird ein
- <acronym>PHP</acronym> <type>String</type> zurückgegeben und ist sofort benutzbar.
- </para>
- <para>
- Der erste Parameter the Methode <methodname>call()</methodname> ist der Name der
- aufzurufenden Methode. Wenn die entfernte Methode weitere Parameter
- benötigt, können diese durch einen zweiten, optionalen Parameter des Typs
- <type>Array</type> an <methodname>call()</methodname> angegeben werden, wie folgendes
- Beispiel zeigt:
- </para>
- <example id="zend.xmlrpc.client.method-calls.example-2">
- <title>XML-RPC Methodenaufruf mit Parametern</title>
- <programlisting language="php"><![CDATA[
- $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
- $arg1 = 1.1;
- $arg2 = 'foo';
- $result = $client->call('test.sayHello', array($arg1, $arg2));
- // $result ist ein nativer PHP-Typ
- ]]></programlisting>
- </example>
- <para>
- Wenn die entfernte Methode keine Parameter erwartet, kann der
- optionale Parameter weggelassen oder stattdessen ein leeres
- <methodname>array()</methodname> übergeben werden. Das, die Parameter -
- für die entfernte Methode - enthaltende, Array kann native
- <acronym>PHP</acronym> Typen, <classname>Zend_XmlRpc_Value</classname>-Objekte oder
- eine Mischung aus Beidem enthalten.
- </para>
- <para>
- Die <methodname>call()</methodname>-Methode konvertiert automatisch die
- <acronym>XML-RPC</acronym> Antwort in dessen äquivalenten nativen
- <acronym>PHP</acronym> Typen und gibt sie zurück. Ein
- <classname>Zend_XmlRpc_Response</classname> Objekt als Rückgabewert ist auch verfübar
- durch das Aufrufen der Methode <methodname>getLastResponse()</methodname> nach dem
- Aufruf (der entfernten Methode).
- </para>
- </sect2>
- <sect2 id="zend.xmlrpc.value.parameters">
- <title>Typen und Konvertierung</title>
- <para>
- Einige entfernte Methodenaufrufe benötigen Parameter. Diese werden
- an die Methode <methodname>call()</methodname> des
- <classname>Zend_XmlRpc_Client</classname>s als Array im zweiten Parameter übergeben.
- Jeder Parameter kann entweder ein nativer <acronym>PHP</acronym> Typ sein, der
- automatisch konvertiert wird, oder ein Objekt, das einem speziellen
- <acronym>XML-RPC</acronym> Typen (eines der
- <classname>Zend_XmlRpc_Value</classname>-Objekte) entspricht.
- </para>
- <sect3 id="zend.xmlrpc.value.parameters.php-native">
- <title>Native PHP-Typen als Parameter</title>
- <para>
- Parameter können der Methode <methodname>call()</methodname> als native
- <acronym>PHP</acronym> Variablen übergeben werden, also als <type>String</type>,
- <type>Integer</type>, <type>Float</type>,
- <type>Boolean</type>, <type>Array</type> oder als
- <type>Object</type>. In diesem Fall wird jeder native <acronym>PHP</acronym> Typ
- automatisch erkannt und dann in einen der folgenden <acronym>XML-RPC</acronym>
- Typen konvertiert, welche in dieser Tabelle ersichtlich ist:
- </para>
- <table id="zend.xmlrpc.value.parameters.php-native.table-1">
- <title>PHP- und XML-RPC-Typkonvertierungen</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Nativer <acronym>PHP</acronym> Typ</entry>
- <entry><acronym>XML-RPC</acronym> Typ</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>integer</entry>
- <entry>int</entry>
- </row>
- <row>
- <entry>Zend_Crypt_Math_BigInteger</entry>
- <entry>i8</entry>
- </row>
- <row>
- <entry>double</entry>
- <entry>double</entry>
- </row>
- <row>
- <entry>boolean</entry>
- <entry>boolean</entry>
- </row>
- <row>
- <entry>string</entry>
- <entry>string</entry>
- </row>
- <row>
- <entry>null</entry>
- <entry>nil</entry>
- </row>
- <row>
- <entry>array</entry>
- <entry>array</entry>
- </row>
- <row>
- <entry>associative array</entry>
- <entry>struct</entry>
- </row>
- <row>
- <entry>object</entry>
- <entry>array</entry>
- </row>
- <row>
- <entry>Zend_Date</entry>
- <entry>dateTime.iso8601</entry>
- </row>
- <row>
- <entry>DateTime</entry>
- <entry>dateTime.iso8601</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <note>
- <title>Auf welchen Typ werden leere Arrays gecastet?</title>
- <para>
- Die Übergabe eines leeren Array an eine <acronym>XML-RPC</acronym> Methode ist
- problematisch, da es entweder ein Array oder ein Struct repräsentieren könnte.
- <classname>Zend_XmlRpc_Client</classname> erkennt solche Konditionen und führt
- eine Abfrage zur <command>system.methodSignature</command> Methode des Servers
- aus, um den richtigen <acronym>XML-RPC</acronym> Typ festzustellen auf den
- gecastet werden soll.
- </para>
- <para>
- Trotzdem kann das selbst sogar zu Problemen führen. Erstens werden Server die
- <command>system.methodSignature</command> nicht unterstützen fehlerhafte
- Anfragen protokollieren, und <classname>Zend_XmlRpc_Client</classname> wird
- selbst einen Ausweg nehmen und den Wert auf einen <acronym>XML-RPC</acronym>
- Arraytyp casten. Zusätzlich bedeutet dass das jeder Aufruf mit einem Array
- Argument zu einem zusätzlichen Aufruf beim Remote Server führt.
- </para>
- <para>
- Um das Nachsehen komplett abzuschalten kann die
- <methodname>setSkipSystemLookup()</methodname> Methode aufgerufen werden bevor
- der <acronym>XML-RPC</acronym> Aufruf durchgeführt wird:
- </para>
- <programlisting language="php"><![CDATA[
- $client->setSkipSystemLookup(true);
- $result = $client->call('foo.bar', array(array()));
- ]]></programlisting>
- </note>
- </sect3>
- <sect3 id="zend.xmlrpc.value.parameters.xmlrpc-value">
- <title>Zend_XmlRpc_Value-Objekte als Parameter</title>
- <para>
- Parameter können auch direkt als <classname>Zend_XmlRpc_Value</classname>-Instanzen
- erstellt werden, um einen exakten <acronym>XML-RPC</acronym> Typen darzustellen.
- Die wichtigsten Gründe dafür sind:
- <itemizedlist>
- <listitem>
- <para>
- Wenn sichergestellt werden soll, dass der Prozedur der
- korrekte Parametertyp übergeben wird (z.B. braucht die
- Prozedur einen integer, während diese vielleicht
- von einer Datenbank als String zurückgegeben wird).
- </para>
- </listitem>
- <listitem>
- <para>
- Wenn die Prozedur einen <property>base64</property>- oder einen
- <property>dateTime.iso8601</property>-Typ benötigt, da diese
- nicht als native <acronym>PHP</acronym> Typen existieren.
- </para>
- </listitem>
- <listitem>
- <para>
- Wenn eine automatische Konvertierung fehlschlägt. Zum Beispiel wenn
- eine leere <acronym>XML-RPC</acronym> Struktur als Parameter für die
- Prozedur gewünscht ist. Leere Strukturen werden jedoch als leere Arrays
- in <acronym>PHP</acronym> gehandhabt, aber wenn man ein leeres Array
- als Parameter übergeben will, dann wird es automatisch zu einem
- <acronym>XML-RPC</acronym> Array konvertiert, da es kein assoziatives
- Array ist.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Es gibt zwei Möglichkeiten ein <classname>Zend_XmlRpc_Value</classname>-Objekt
- zu erstellen: Direkte Instanzierung einer
- <classname>Zend_XmlRpc_Value</classname>-Subklasse oder das Nutzen der statischen
- Fabrikmethode <methodname>Zend_XmlRpc_Value::getXmlRpcValue()</methodname>.
- </para>
- <table id="zend.xmlrpc.value.parameters.xmlrpc-value.table-1">
- <title>Zend_XmlRpc_Value Objekte als XML-RPC Typen</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry><acronym>XML-RPC</acronym> Typ</entry>
- <entry><classname>Zend_XmlRpc_Value</classname> Konstante</entry>
- <entry><classname>Zend_XmlRpc_Value</classname> Objekt</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>int</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Integer</classname></entry>
- </row>
- <row>
- <entry>i8</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_I8</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_BigInteger</classname></entry>
- </row>
- <row>
- <entry>ex:i8</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_APACHEI8</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_BigInteger</classname></entry>
- </row>
- <row>
- <entry>double</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Double</classname></entry>
- </row>
- <row>
- <entry>boolean</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Boolean</classname></entry>
- </row>
- <row>
- <entry>string</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_STRING</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_String</classname></entry>
- </row>
- <row>
- <entry>nil</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_NIL</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Nil</classname></entry>
- </row>
- <row>
- <entry>ex:nil</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_APACHENIL</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Nil</classname></entry>
- </row>
- <row>
- <entry>base64</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Base64</classname></entry>
- </row>
- <row>
- <entry>dateTime.iso8601</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_DateTime</classname></entry>
- </row>
- <row>
- <entry>array</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Array</classname></entry>
- </row>
- <row>
- <entry>struct</entry>
- <entry>
- <constant>Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT</constant>
- </entry>
- <entry><classname>Zend_XmlRpc_Value_Struct</classname></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- <note>
- <title>Automatische Konvertierung</title>
- <para>
- Bei der Erstellung eines neuen
- <classname>Zend_XmlRpc_Value</classname>-Objekts wird dessen Wert durch
- einen nativen <acronym>PHP</acronym> Typ gesetzt. Dieser
- <acronym>PHP</acronym> Typ wird durch <acronym>PHP</acronym> Casting in den
- gewünschten Typ umgewandelt. Beispielsweise wird ein String, der als Wert
- für ein <classname>Zend_XmlRpc_Value_Integer</classname>-Objekt genutzt
- wird, durch <command>(int)$value</command> in ein Integer konvertiert.
- </para>
- </note>
- </para>
- </sect3>
- </sect2>
- <sect2 id="zend.xmlrpc.client.requests-and-responses">
- <title>Server-Proxy-Objekt</title>
- <para>
- Ein anderer Weg um entfernte Methoden mit <acronym>XML-RPC</acronym> Clients
- aufzurufen, ist die Verwendung eines Server-Proxys. Dies ist ein
- <acronym>PHP</acronym> Objekt, das einen entfernten <acronym>XML-RPC</acronym>
- Namensraum umleitet, sodass es so weit wie möglich als <acronym>PHP</acronym> Objekt
- arbeitet wie es möglich ist.
- </para>
- <para>
- Um einen Server-Proxy zu instanzieren, muss die Methode
- <methodname>getProxy()</methodname> der Klasse <classname>Zend_XmlRpc_Client</classname>
- aufgerufen werden. Das retourniert eine Instanz von
- <classname>Zend_XmlRpc_Client_ServerProxy</classname>. Jeder Methodenaufruf
- wird zur entsprechenden entfernten Methode weitergeleitet. Die Parameter
- können übergeben werden, wie bei jeder anderen <acronym>PHP</acronym> Methode.
- </para>
- <example id="zend.xmlrpc.client.requests-and-responses.example-1">
- <title>Umleitung zum Standard-Namenraum</title>
- <programlisting language="php"><![CDATA[
- $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
- $service = $client->getProxy(); // Umleitung im Standard-Namenraum
- $hello = $service->test->sayHello(1, 2); // test.Hello(1, 2) gibt "hello" zurück
- ]]></programlisting>
- </example>
- <para>
- Die Methode <methodname>getProxy()</methodname> erhält ein optionales Argument,
- welches den Namensraum des entfernten Servers definiert, zu welchem
- die Methodenaufrufe umgeleitet werden. Wenn kein Namensraum übergeben
- wird, wird zum Standard-Namensraum umgeleitet. Im nächsten Beispiel
- wird zum 'test'-Namespace umgeleitet:
- </para>
- <example id="zend.xmlrpc.client.requests-and-responses.example-2">
- <title>Umleitung zu einem beliebigen Namensraum</title>
- <programlisting language="php"><![CDATA[
- $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
- $test = $client->getProxy('test'); // Leitet zum "test"-Namensraum um
- $hello = $test->sayHello(1, 2); // test.Hello(1,2) gibt "hello" zurück
- ]]></programlisting>
- </example>
- <para>
- Wenn der entfernte Server verschachtelte Namensräume jeglicher
- Tiefe erlaubt, können diese auch durch den Server-Proxy genutzt
- werden. Wenn der Server in obigem Beispiel eine Methode
- <command>test.foo.bar()</command> hätte, könnte es durch
- <command>$test->foo->bar()</command> aufgerufen werden.
- </para>
- </sect2>
- <sect2 id="zend.xmlrpc.client.error-handling">
- <title>Fehlerbehandlung</title>
- <para>
- Es gibt zwei Arten von Fehlern, die während eines <acronym>XML-RPC</acronym>
- Methodenaufruf autreten können: <acronym>HTTP</acronym> und <acronym>XML-RPC</acronym>
- Fehler. Der <classname>Zend_XmlRpc_Client</classname> erkennt beide und ermöglicht es,
- diese unabhängig voneinander zu entdecken und abzufangen.
- </para>
- <sect3 id="zend.xmlrpc.client.error-handling.http">
- <title>HTTP-Fehler</title>
- <para>
- Wenn ein <acronym>HTTP</acronym> Fehler auftritt, wie z.B. wenn der entfernte
- <acronym>HTTP</acronym> Server einen <emphasis>404 Not Found</emphasis> zurückgibt,
- wird eine <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen.
- </para>
- <example id="zend.xmlrpc.client.error-handling.http.example-1">
- <title>Verarbeiten von HTTP-Fehlern</title>
- <programlisting language="php"><![CDATA[
- $client = new Zend_XmlRpc_Client('http://foo/404');
- try {
- $client->call('bar', array($arg1, $arg2));
- } catch (Zend_XmlRpc_Client_HttpException $e) {
- // $e->getCode() gibt 404 zurück
- // $e->getMessage() gibt "Not Found" zurück
- }
- ]]></programlisting>
- </example>
- <para>
- Ungeachtet des benutzten <acronym>XML-RPC</acronym> Clients wird immer eine
- <classname>Zend_XmlRpc_Client_HttpException</classname> geworfen, wenn
- ein <acronym>HTTP</acronym> Fehler auftritt.
- </para>
- </sect3>
- <sect3 id="zend.xmlrpc.client.error-handling.faults">
- <title>XML-RPC-Fehler</title>
- <para>
- Ein <acronym>XML-RPC</acronym> Fehler wird analog zu einer <acronym>PHP</acronym>
- Exception verwendet. Es ist ein spezieller Typ, der durch einen
- <acronym>XML-RPC</acronym> Methodenaufruf zurückgegeben wurden und einen Fehlercode
- sowie eine Fehlermeldung enthält. <acronym>XML-RPC</acronym> Fehler werden
- unterschiedlich behandelt, was von der Benutzung des
- <classname>Zend_XmlRpc_Client</classname>s abhängt.
- </para>
- <para>
- Wenn die Methode <methodname>call()</methodname> oder der Server-Proxy genutzt
- wird, würde durch einen <acronym>XML-RPC</acronym> Fehler eine
- <classname>Zend_XmlRpc_Client_FaultException</classname> geworfen werden. Der
- Fehlercode und die -meldung der Exception zeigen auf deren zugehörige
- Werte in der originalen <acronym>XML-RPC</acronym> Fehlerantwort.
- </para>
- <example id="zend.xmlrpc.client.error-handling.faults.example-1">
- <title>Verarbeiten von XML-RPC Fehlern</title>
- <programlisting language="php"><![CDATA[
- $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
- try {
- $client->call('badMethod');
- } catch (Zend_XmlRpc_Client_FaultException $e) {
- // $e->getCode() gibt 1 zurück
- // $e->getMessage() gibt "Unknown method" zurück
- }
- ]]></programlisting>
- </example>
- <para>
- Wenn die Methode <methodname>call()</methodname> genutzt wird, um eine Anfrage zu
- starten, wird die <classname>Zend_XmlRpc_Client_FaultException</classname> bei einem
- Fehler geworfen. Ein <classname>Zend_XmlRpc_Response</classname>-Objekt, das den
- Fehler enthält, ist allerdings auch verfübar durch die Methode
- <methodname>getLastResponse()</methodname>.
- </para>
- <para>
- Wenn die Methode <methodname>doRequest()</methodname> genutzt wird, um eine
- Anfrage zu starten, wird keine Exception geworfen. Stattdessen
- wird ein <classname>Zend_XmlRpc_Response</classname>-Objekt zurückgegeben,
- das den Fehler enthält. Dieses kann durch den Aufruf der Methode
- <methodname>isFault()</methodname> der Klasse
- <classname>Zend_XmlRpc_Response</classname> überprüft werden.
- </para>
- </sect3>
- </sect2>
- <sect2 id="zend.xmlrpc.client.introspection">
- <title>Server Selbstüberprüfung</title>
- <para>
- Einige <acronym>XML-RPC</acronym> Server bieten de facto Überprüfungsmethoden unter dem
- <acronym>XML-RPC</acronym> Namesraum <emphasis>system.</emphasis>.
- <classname>Zend_XmlRpc_Client</classname> stellt spezielle Verfahren für Server mit
- diesen Möglichkeiten zur Verfügung.
- </para>
- <para>
- Eine Instanz der Klasse <classname>Zend_XmlRpc_Client_ServerIntrospection</classname>
- kann über die Methode <methodname>getIntrospector()</methodname> der Klasse
- <classname>Zend_XmlRpcClient</classname> zurückgegeben werden. Sie kann dann genutzt
- werden, um Überwachungsoperationen auf dem Server auszuführen.
- </para>
- </sect2>
- <sect2 id="zend.xmlrpc.client.request-to-response">
- <title>Von der Anfrage zur Antwort</title>
- <para>
- Intern erstellt die Methode <methodname>call()</methodname> des
- <classname>Zend_XmlRpc_Client</classname>-Objekts ein Anfrage-Objekt
- (<classname>Zend_XmlRpc_Request</classname>) und sendet es zu einer anderen
- Methode, <methodname>doRequest()</methodname>, die ein Antwort-Objekt
- (<classname>Zend_XmlRpc_Response</classname>) zurückgibt.
- </para>
- <para>
- Die Methode <methodname>doRequest()</methodname> kann auch direkt genutzt werden:
- </para>
- <example id="zend.xmlrpc.client.request-to-response.example-1">
- <title>Eine Anfrage zu einer Antwort verarbeiten</title>
- <programlisting language="php"><![CDATA[
- $client = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
- $request = new Zend_XmlRpc_Request();
- $request->setMethod('test.sayHello');
- $request->setParams(array('foo', 'bar'));
- $client->doRequest($request);
- // $client->getLastRequest() gibt ein Zend_XmlRpc_Request-Objekt zurück
- // $client->getLastResponse() gibt ein Zend_XmlRpc_Response-Objekt zurück
- ]]></programlisting>
- </example>
- <para>
- Immer wenn eine <acronym>XML-RPC</acronym> Methode vom Client aufgerufen wird,
- egal auf welche Weise - entweder über die Methode <methodname>call()</methodname>,
- die Methode <methodname>doRequest()</methodname> oder den Server-Proxy -, ist das
- Objekt der letzten Anfrage, sowie dessen resultierende Antwort-Objekte,
- immer durch die Methoden <methodname>getLastRequest()</methodname> und
- <methodname>getLastResponse()</methodname> verfügbar.
- </para>
- </sect2>
- <sect2 id="zend.xmlrpc.client.http-client">
- <title>HTTP-Client und das Testen</title>
- <para>
- In jedem der vorangegangenen Beispiele wurde kein <acronym>HTTP</acronym> Client
- bestimmt. In diesem Fall wird eine neue Instanz eines
- <classname>Zend_Http_Client</classname>s mit dessen standardmäßigen
- Einstellungen erstellt und automatisch vom <classname>Zend_XmlRpc_Client</classname>
- benutzt.
- </para>
- <para>
- Der <acronym>HTTP</acronym> Client kann zu jeder Zeit mit der Methode
- <methodname>getHttpClient()</methodname> zurückgegeben werden. In den meisten
- Fällen jedoch ist der Standard <acronym>HTTP</acronym> Client ausreichend. Allerdings
- erlaubt die Methode <methodname>setHttpClient()</methodname> das Setzen eines
- anderen <acronym>HTTP</acronym> Clients.
- </para>
- <para>
- Die Methode <methodname>setHttpClient()</methodname> ist besonders nützlich für
- UnitTests. Wenn es mit dem <classname>Zend_Http_Client_Adapter_Test</classname>
- kombiniert wird, können entfernte Services für das Testen nachgeahmt werden.
- In den UnitTests für <classname>Zend_XmlRpc_Client</classname> sind Beispiele,
- wie so was erreicht werden kann.
- </para>
- </sect2>
- </sect1>
|