XML/RPC
- Introdurre XML-RPC
- Scrivere codice XML-RPC a partire da esempi
Che cos'è RPC
[modifica | modifica sorgente]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 | modifica sorgente]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.
Tipi di dati
[modifica | modifica sorgente]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 |
Esempi
[modifica | modifica sorgente]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>
Note
[modifica | modifica sorgente]
Collegamenti esterni
[modifica | modifica sorgente]- XML-RPC Homepage
- XML-RPC Specification
- Free Online Dictionary of Computing
- Forum
- Tutorials
- Technology Reports