Zend_XmlRpc_Client.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. <sect1 id="zend.xmlrpc.client">
  2. <title>Zend_XmlRpc_Client</title>
  3. <sect2 id="zend.xmlrpc.client.introduction">
  4. <title>Introdução</title>
  5. <para>A forma de utilização do <code>Zend_XmlRpc_Client</code> é muito
  6. similar a dos objetos <code>SoapClient</code> (<ulink
  7. url="http://www.php.net/soap">extensão SOAP web service</ulink>). Você
  8. pode simplesmente chamar os procedimentos de serviço do XML-RPC como
  9. métodos de <code>Zend_XmlRpc_Client</code> . Especifique o endereço
  10. completo do serviço para o construtor do
  11. <code>Zend_XmlRpc_Client</code>.</para>
  12. <example>
  13. <title>Uma requisição XML-RPC básica</title>
  14. <programlisting role="php">&lt;?php
  15. /**
  16. * Connect to framework.zend.com server and an array describing
  17. * the methods available.
  18. */
  19. require_once 'Zend/XmlRpc/Client.php';
  20. $server = new Zend_XmlRpc_Client('http://framework.zend.com/xmlrpc');
  21. print_r( $server-&gt;system-&gt;listMethods() );
  22. ?&gt;
  23. </programlisting>
  24. </example>
  25. <note><para>
  26. <code>Zend_XmlRpc_Client</code>
  27. tenta, na medida do possível, utilizar métodos remotos como se fossem nativos. Se um método remoto contiver namespaces, como por exemplo
  28. <code>system.listMethods()</code>
  29. , a chamada é feita usando encadeamento de objetos em PHP:
  30. <code>$server-&gt;system-&gt;listMethods()</code>
  31. .
  32. </para></note>
  33. </sect2>
  34. <sect2 id="zend.xmlrpc.client.parameters">
  35. <title>Usando parâmetros</title>
  36. <para>Alguns procedimentos de serviço XML-RPC requerem parâmetros, os
  37. parâmetros necessários são passados, como parâmetros, para o método
  38. <code>Zend_XmlRpc_Client</code>. Os parâmetros do procedimento XML-RPC
  39. devem ser de tipos de dados específicos ao XML-RPC. Os parâmetros podem
  40. ser passsados de duas maneiras: tipos nativos do PHP e objetos
  41. <code>Zend_XmlRpc_Value</code> que representam os tipos XML-RPC.</para>
  42. <sect3 id="zend.xmlrpc.client.parameters.php_native">
  43. <title>Passando variáveis nativas como parâmetros em PHP</title>
  44. <para>Um parâmetro passado como variável nativa do PHP, pode ser uma
  45. string, um inteiro, um flutuante, um boleano, um array ou um objeto.
  46. Neste caso, cada tipo PHP nativo irá ser automaticamente detectado e
  47. convertido em um tipo XML-RPC, de acordo com a tabela abaixo:</para>
  48. <table>
  49. <title>Conversão de valores nativos do PHP para tipos XML-RPC</title>
  50. <tgroup cols="2">
  51. <thead>
  52. <row>
  53. <entry>Tipos nativos do PHP</entry>
  54. <entry>Tipos XML-RPC</entry>
  55. </row>
  56. </thead>
  57. <tbody>
  58. <row>
  59. <entry>inteiro</entry>
  60. <entry>int</entry>
  61. </row>
  62. <row>
  63. <entry>double</entry>
  64. <entry>double</entry>
  65. </row>
  66. <row>
  67. <entry>boleano</entry>
  68. <entry>boolean</entry>
  69. </row>
  70. <row>
  71. <entry>string</entry>
  72. <entry>string</entry>
  73. </row>
  74. <row>
  75. <entry>array</entry>
  76. <entry>array</entry>
  77. </row>
  78. <row>
  79. <entry>array associativo</entry>
  80. <entry>struct</entry>
  81. </row>
  82. <row>
  83. <entry>objeto</entry>
  84. <entry>array</entry>
  85. </row>
  86. </tbody>
  87. </tgroup>
  88. </table>
  89. <programlisting role="php">...
  90. /** 2 parameters are passed in this procedure
  91. * The first parameter is a string that will be auto-converted into an XML-RPC string type
  92. * The second parameter is an assosiative array that will be converted into an XML-RPC struct
  93. */
  94. $p1 = 'parameter 1';
  95. $p2 = array('name' =&gt; 'Joe', 'age' =&gt; 30);
  96. $service-&gt;serviceProcedure($p1, $p2);
  97. ...
  98. </programlisting>
  99. </sect3>
  100. <sect3 id="zend.xmlrpc.client.parameters.xmlrpc_value">
  101. <title>Passando objetos <code>Zend_XmlRpc_Value</code> como
  102. parâmetros</title>
  103. <para>Parameters passados como objetos <code>Zend_XmlRpc_Value</code>.
  104. Você pode criar uma das instâncias de <code>Zend_XmlRpc_Value</code>
  105. para especificar o tipo XML-RPC exato dos seus parâmetros. As razões
  106. principais para especificar explicitamente os tipos XML-RPC são:
  107. <itemizedlist>
  108. <listitem>
  109. <para>
  110. Quando você quer assegurar que o tipo correto do parâmetro seja passado ao procedimento (ex: o procedimento exige um inteiro e você pode receber o parâmetro do array $_GET como string)
  111. </para>
  112. </listitem>
  113. <listitem>
  114. <para>
  115. Quando o procedimento exige um tipo datetime ou um base64 (que não são tipos nativos do PHP).
  116. </para>
  117. </listitem>
  118. <listitem>
  119. <para>
  120. Quando a existe a possibilidade da conversão automática falhar (ex: você quer passar uma estrutura XML-RPC vazia como parâmetro. Estruturas vazias são representadas como arrays vazios em PHP, mas, se você fornecer um array vazio como parãmetro ele irá ser automaticamente convertido para um array XML-RPC, desde que não seja um array associativo)
  121. </para>
  122. </listitem>
  123. </itemizedlist></para>
  124. <para>Existem duas maneiras de criar um objeto
  125. <code>Zend_XmlRpc_Value</code> object: a maneira explícita (chamando o
  126. construtor do objeto) ou usando a função estática
  127. <code>Zend_XmlRpc_Value::getXmlRpcValue()</code> que irá requerer uma
  128. constante XML-RPC.</para>
  129. <table>
  130. <title><code>Objeto Zend_XmlRpc_Value</code> representando os tipos
  131. XML-RPC</title>
  132. <tgroup cols="3">
  133. <thead>
  134. <row>
  135. <entry>Tipo XML-RPC</entry>
  136. <entry>Constante de comparação
  137. <code>Zend_XmlRpc_Value</code></entry>
  138. <entry>Objeto <code>Zend_XmlRpc_Value</code></entry>
  139. </row>
  140. </thead>
  141. <tbody>
  142. <row>
  143. <entry>int</entry>
  144. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER</code></entry>
  145. <entry><code>Zend_XmlRpc_Value_Integer</code></entry>
  146. </row>
  147. <row>
  148. <entry>double</entry>
  149. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE</code></entry>
  150. <entry><code>Zend_XmlRpc_Value_Double</code></entry>
  151. </row>
  152. <row>
  153. <entry>boolean</entry>
  154. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN</code></entry>
  155. <entry><code>Zend_XmlRpc_Value_Boolean</code></entry>
  156. </row>
  157. <row>
  158. <entry>string</entry>
  159. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_STRING</code></entry>
  160. <entry><code>Zend_XmlRpc_Value_String</code></entry>
  161. </row>
  162. <row>
  163. <entry>base64</entry>
  164. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64</code></entry>
  165. <entry><code>Zend_XmlRpc_Value_Base64</code></entry>
  166. </row>
  167. <row>
  168. <entry>dateTime.iso8601</entry>
  169. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME</code></entry>
  170. <entry><code>Zend_XmlRpc_Value_DateTime</code></entry>
  171. </row>
  172. <row>
  173. <entry>array</entry>
  174. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY</code></entry>
  175. <entry><code>Zend_XmlRpc_Value_Array</code></entry>
  176. </row>
  177. <row>
  178. <entry>struct</entry>
  179. <entry><code>Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT</code></entry>
  180. <entry><code>Zend_XmlRpc_Value_Struct</code></entry>
  181. </row>
  182. </tbody>
  183. </tgroup>
  184. </table>
  185. <programlisting role="php">...
  186. /** 2 parameters are passed to this procedure
  187. * The first parameter is an XML-RPC base64 type that is created using the static Zend_XmlRpc_Value::getXmlRpcValue() function
  188. * The second parameter is an XML-RPC strcture that is created explictly
  189. */
  190. $p1 = ZXmlRpcValue::getXmlRpcValue('encoded string', Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64);
  191. $p2 = new Zend_XmlRpc_Value_Struct(array('name' =&gt; 'Joe', 'age' =&gt; 30));
  192. $service-&gt;serviceProcedure($p1, $p2);
  193. ...
  194. </programlisting>
  195. <note><para>
  196. O valor do parâmetro é cedido por uma variável PHP mas irá ser convertido para o tipo específico usando as técnicas de conversão do PHP (ex: se uma string é informada como um valor para o objeto
  197. <code>Zend_XmlRpc_Value_Integer</code>
  198. , ele irá ser convertido usando
  199. <code>(int)$value</code>
  200. ).
  201. </para></note>
  202. </sect3>
  203. <sect3 id="zend.xmlrpc.client.parameters.as_xml">
  204. <title>Analisando uma string XML contida em um parâmetro XML-RPC</title>
  205. <para>Este método de passagem por parâmetros é usado internamente no
  206. pacote <code>Zend_XmlRpc</code> e seu uso não é recomendado.</para>
  207. <para>Se você tiver necessidade de usar este método, você deve usar a
  208. função estática <code>Zend_XmlRpc_Value::getXmlRpcValue()</code> para
  209. analisar uma string XML em um objeto <code>Zend_XmlRpc_Value</code> que
  210. representa o tipo XML-RPC correspondente. A função
  211. <code>Zend_XmlRpc_Value::getXmlRpcValue()</code> deve receber dois
  212. parâmetros: a string XML e a constante
  213. <code>Zend_XmlRpc_Value::XML_STRING</code>.</para>
  214. </sect3>
  215. </sect2>
  216. <sect2 id="zend.xmlrpc.client.wsdl">
  217. <title>Indicando o tipo dos parâmetros</title>
  218. <para>A principal diferença entre XML-RPC e web services SOAP é o arquivo
  219. WSDL. O protocolo SOAP usualmente possui um arquivo WSDL que descreve a
  220. interface para o web service. De acordo com esta interface, o cliente SOAP
  221. conhece os tipos de parâmetros que devem ser enviados ao servidor e quais
  222. são os tipos dos valores de retorno. Sem o arquivo WSDL, o usuário pode
  223. enfrentar problemas para descobrir quais são os tipos.</para>
  224. <para>O solução do protocolo XML-RPC usa um procedimento de serviço
  225. especial chamado <code>system.methodSignature</code>. Este procedimento
  226. toma o nome do procedimento como um parâmetro e retorna a assinatura de um
  227. dado procedimento. A assinatura contém os respectivos tipos do parâmetro
  228. requerido e do valor de retorno do procedimento.</para>
  229. <note>
  230. <para>Nem todos os servidores XML-RPC suportam o procedimento especial
  231. <code>system.methodSignature</code>
  232. , e consequentemente, não suportam também a indicação de tipo. </para>
  233. </note>
  234. <para>O <code>Zend_XmlRpc_Client</code> implementa uma gama de tipos de
  235. arquivos WSDL para servidores XML-RPC usando o procedimento
  236. <code>system.methodSignature</code>. Se solicitado,
  237. <code>Zend_XmlRpc_Client</code> irá requisitar uma lista de todos os
  238. procedimentos de um servidor XML-RPC, incluindo todas as assinaturas
  239. destes procedimentos. Todos esses dados serão gravados em um arquivo XML
  240. (similar ao arquivo SOAP WSDL). Quando o mesmo servidor XML-RPC for
  241. utilizado novamente, o usuário pode fornecer o arquivo XML e o
  242. <code>Zend_XmlRpc_Client</code> irá indicar o tipo de todos os parâmetros
  243. para os procedimentos requisitados, de acordo com suas assinaturas.</para>
  244. <para>O arquivo XML contendo as assinaturas dos procedimentos é criado
  245. chamando-se a função<code> Zend_XmlRpc_Client::__getMethodsXml()</code> (a
  246. função retorna uma string XML contendo todos os dados das assinaturas).
  247. Para selecionar um arquivo XML de assinaturas, o usuário pode passar os
  248. dados XML como um parâmetro para o construtor
  249. <code>Zend_XmlRpc_Client</code> ou chamar a função
  250. <code>Zend_XmlRpc_Client::__setMethodsXml()</code>.</para>
  251. <example>
  252. <title>Chamando um serviço XML-RPC com indicação de tipo</title>
  253. <programlisting role="php">&lt;?php
  254. /**
  255. * Connect to an XML-RPC server, and save it's signatures file (the XML-RPC eqvivilant to a SOAP WSDL file)
  256. */
  257. require_once 'Zend/XmlRpc/Client.php';
  258. $service = new Zend_XmlRpc_Client('http://www.example.org/xmlrpc');
  259. file_put_contents('/tmp/xmlrpc-signatures/example.xml', $service-&gt;__getMethodsXml());
  260. /* The $service object contains all the signatures of the XML-RPC server,
  261. when the serviceProcedure is called, its parameter ($param) is converted
  262. to the necessary type according to the procedure's signature.
  263. */
  264. $service-&gt;serviceProcedure($param);
  265. ?&gt;
  266. </programlisting>
  267. <programlisting role="php">&lt;?php
  268. /**
  269. * Connect to an XML-RPC server, using an existing signature file, we make sure
  270. * that the type of the parameters passed to the procedures are of the necessary type
  271. */
  272. require_once 'Zend/XmlRpc/Client.php';
  273. $signature_file_xml = file_get_contents('/tmp/xmlrpc-signatures/example.xml');
  274. $service = new Zend_XmlRpc_Client('http://www.example.org/xmlrpc', 'namespace', $signature_file_xml);
  275. /* The $service object contains all the signatures of the XML-RPC server,
  276. when the serviceProcedure is called, its parameter ($param) is converted
  277. to the necessary type according to the procedure's signature.
  278. */
  279. $service-&gt;serviceProcedure($param);
  280. ?&gt;
  281. </programlisting>
  282. </example>
  283. </sect2>
  284. <sect2 id="zend.xmlrpc.client.response">
  285. <title>Obtendo a resposta</title>
  286. <para>O procedimento retorna um valor de um tipo XML-RPC. O método
  287. <code>Zend_XmlRpc_Client</code> que chama o procedimento XML-RPC retorna
  288. um tipo nativo do PHP que foi convertido a partir de um tipo XML-RPC
  289. retornado.</para>
  290. <para>Você pode usar a função
  291. <code>Zend_XmlRpc_Client::__getResponse()</code> para recuperar o valor de
  292. retorno do procedimento requisitado. A função <code>__getResponse()</code>
  293. recebe um parâmetro que indica o tipo do valor de retorno. As opções de
  294. resposta são: <itemizedlist>
  295. <listitem>
  296. <para>
  297. <code>Zend_XmlRpc_Client::RESPONSE_PHP_NATIVE</code>
  298. - Devolve o valor de retorno do procedimento convertido para um tipo nativo do PHP (converte o tipo XML-RPC em um tipo PHP).
  299. </para>
  300. </listitem>
  301. <listitem>
  302. <para>
  303. <code>Zend_XmlRpc_Client::RESPONSE_XML_STRING</code>
  304. - Retorna a string XML representando a resposta XML-RPC.
  305. </para>
  306. </listitem>
  307. <listitem>
  308. <para>
  309. ´ <code>Zend_XmlRpc_Client::RESPONSE_ZXMLRPC_OBJECT</code>
  310. - Retorna um objeto
  311. <code>Zend_XmlRpc_Value</code>
  312. object que representa o tipo XML-RPC retornado.
  313. </para>
  314. </listitem>
  315. </itemizedlist></para>
  316. <programlisting role="php">...
  317. $service-&gt;serviceProcedure();
  318. $response = $service-&gt;__getResponse();
  319. // $response is the PHP variable converted from the XML-RPC type return value
  320. $response = $service-&gt;__getResponse(ZXmlRpcClient::RESPONSE_XML_STRING);
  321. // $response is a string containing the XML representing the procedure return value
  322. $response = $service-&gt;__getResponse(ZXmlRpcClient::RESPONSE_ZXMLRPC_OBJECT);
  323. // $response is a Zend_XmlRpc_Value instance representing the XML-RPC type return value
  324. ...
  325. </programlisting>
  326. </sect2>
  327. </sect1>
  328. <!--
  329. vim:se ts=4 sw=4 et:
  330. -->