Indice del libro

Obiettivi di apprendimento

  • Introdurre XML-RPC
  • Scrivere codice XML-RPC a partire da esempi

Che cos'è RPC

modifica

Per comprendere appieno XML-RPC, dobbiamo prima definire RPC. Una Remote Procedure Call (RPC) è un protocollo che consente a un programma in esecuzione su un host di generare codice che sarà eseguito su un altro host senza che il programmatore debba esplicitamente scrivere codice per questo. Un RPC viene avviato dal client che invia un messaggio di richiesta a un sistema remoto (il server) per eseguire una determinata procedura utilizzando gli argomenti forniti. Un messaggio con il risultato verrà restituito al client. Esistono varie implementazioni con molte varianti e finezze, con la conseguenza che esistono vari protocolli RPC diversi (incompatibili tra di loro).

Al fine di consentire l'accesso ai server da parte di client diversi, sono stati creati numerosi sistemi RPC standardizzati. La maggior parte di questi utilizza un IDL (Interface Description Language) per consentire a varie piattaforme di chiamare la RPC. I servizi web sono stati il ​​primo vero tentativo di implementare RPC su diverse piattaforme. Utilizzando i servizi web un client .NET può chiamare una procedura remota implementata in Java su un server Unix (e viceversa).

I servizi web utilizzano XML come IDL e HTTP come protocollo di rete. I vantaggi di questo sistema sono la semplicità e la standardizzazione: l'IDL è un file di testo ampiamente compreso e l'HTTP è integrato in quasi tutti i sistemi operativi moderni. Un esempio di tale sistema RPC è XML-RPC.

Che cos'è XML-RPC

modifica

XML-RPC (Extensible Markup Language Remote Procedure Call) è un protocollo Remote Procedure Call codificato in XML. È un protocollo molto semplice, che definisce solo una manciata di tipi di dati e comandi, e l'intera descrizione può essere stampata su due pagine di carta. Ciò è in netto contrasto con la maggior parte dei sistemi RPC, in cui i documenti standard spesso arrivano a migliaia di pagine e richiedono un notevole supporto software per poter essere utilizzati.

È stato creato da Dave Winer nel 1995 per Microsoft. Tuttavia, Microsoft lo considerò troppo semplice e iniziò ad aggiungere funzionalità. Dopo varie integrazioni, lo standard non fu più così semplice e divenne quello che ora è SOAP.

« Volevamo un formato pulito ed estensibile che fosse molto semplice. Per un programmatore HTML dovrebbe essere possibile guardare un file contenente una chiamata di procedura XML-RPC, capire cosa sta facendo ed essere in grado di modificarlo e farlo funzionare al primo o al secondo tentativo... Volevamo anche che fosse un protocollo facile da implementare, che potesse essere rapidamente adattato per funzionare in altri ambienti o su altri sistemi operativi. »
(xmlrpc.com)

Tipi di dati

modifica
Nome Esempio Descrizione
array
 <array>
   <data>
     <value><i4>1404</i4></value>
     <value><string>Something Here</string></value>
     <value><i4>1</i4></value>
   </data>
 </array>
Matrice di valori, senza memorizzazione di chiavi
base64 <base64>eW91IGNhbid0IHJlYWQgdGhpcyE=</base64> Dati binari codificati a base 64
boolean <boolean>1</boolean> Valore logico [booleano] (0 o 1)
date/time <dateTime.iso8601>19980717T14:08:55</dateTime.iso8601> Data e ora
double <double>-12.53</double> Doppio numero variabile [precisione]
integer <i4>42</i4> Numero intero, [intero]
string <string>Hello world!</string> Stringa di caratteri, deve seguire la codifica XML
struct
 <struct>
   <member>
     <name>foo</name>
     <value><i4>1</i4></value>
   </member>
   <member>
     <name>bar</name>
     <value><i4>2</i4></value>
   </member>
 </struct>
Matrice di valori, con memorizzazione delle chiavi
nil <nil/> Discrimina il valore nullo; un'estensione XML-RPC

Un esempio di una tipica richiesta XML-RPC sarebbe:

 <?xml version="1.0"?>
 <methodCall>
   <methodName>examples.getStateName</methodName>
   <params>
     <param>
         <value><i4>41</i4></value>
     </param>
   </params>
 </methodCall>

Un esempio di una tipica risposta XML-RPC sarebbe:

 <?xml version="1.0"?>
 <methodResponse>
   <params>
     <param>
         <value><string>South Dakota</string></value>
     </param>
   </params>
 </methodResponse>

Un tipico errore XML-RPC sarebbe:

 <?xml version="1.0"?>
 <methodResponse>
   <fault>
     <value>
       <struct>
         <member>
           <name>faultCode</name>
           <value><int>4</int></value>
         </member>
         <member>
           <name>faultString</name>
           <value><string>Too many parameters.</string></value>
         </member>
       </struct>
     </value>
   </fault>
 </methodResponse>

Un ultimo esempio, confrontando un array associativo PHP con un equivalente <struct> XML-RPC. Questo array:

Array
(
	[0] => 'dogs',
	[1] => 'cats',
	['animals'] => Array(
		[0] => FALSE,
		[1] => 'little_dogs',
		[2] => 'little_cats',
		[3] => 5,
		[4] => 2.3,
		[5] => 1,
			),
);

Diventa il seguente XML-RPC:

<?xml version="1.0" encoding="utf-8"?>
<methodResponse>
      <params>
         <param>
            <value>
               <struct>
                  <member>
                     <name>0
                     </name>
                     <value><string>dogs</string>
                     </value>
                  </member>
                  <member>
                     <name>1
                     </name>
                     <value><string>cats</string>
                     </value>
                  </member>
                  <member>
                     <name>animals
                     </name>
                     <value>
                           <array>
                              <data>
                                 <value><boolean>0</boolean>
                                 </value>
                                 <value><string>little_dogs</string>
                                 </value>
                                 <value><string>little_cats</string>
                                 </value>
                                 <value><i4>5</i4>
                                 </value>
                                 <value><double>2.3</double>
                                 </value>
                                 <value><boolean>1</boolean>
                                 </value>
                              </data>
                           </array>
                     </value>
                  </member>
               </struct>
            </value>
         </param>
      </params>
</methodResponse>


Collegamenti esterni

modifica