XML-RPC: Remote Procedure Call in formato XML

Richiamare funzioni a distanza su computer remoti della rete o su sistemi distribuiti (interconnessione di computer indipendenti) è ormai una pratica comune da decenni. L’idea di base per la tecnologia RPC (Remote Procedure Call) sottostante è stata descritta già nel 1976 da James E. White nel RFC 707, il che la rende antecedente anche alla nascita del World Wide Web.

Fatto

Per rendere il protocollo RPC all’altezza dei requisiti dei sistemi informatici attuali, nel 2015 Google ha sviluppato il framework gRPC.

Una delle soluzioni più popolari per utilizzare questa tecnologia è il protocollo XML-RPC. Le chiamate vengono realizzate tramite il protocollo HTTP(S) e il linguaggio XML (Extensible Markup Language). Cosa si cela dietro questa specifica, dove viene utilizzata e come funziona esattamente?

Che cos’è l’XML-RPC?

L’XML-RPC (abbreviazione di Extensible Markup Language Remote Procedure Call) è una specifica di protocollo per l’esecuzione di chiamate RPC (chiamate remote in reti informatiche) che sfrutta il protocollo stateless HTTP e il linguaggio XML, da cui deriva anche il nome. Mentre l’HTTP regola il trasporto dei dati, la visualizzazione di questi ultimi avviene mediante l’XML. Nel definire lo standard XML-RPC, è stata posta particolare attenzione alla sua compatibilità con vari linguaggi di programmazione e piattaforme di sistema.

N.B.

Sebbene la specifica XML-RPC preveda unicamente il protocollo HTTP non protetto per la trasmissione dei dati, ci sono ormai diverse variazioni diffuse e accettate dello standard che supportano la crittografia più sicura HTTPS, che utilizza anche la crittografia SSL/TLS.

Il protocollo XML-RPC è stato sviluppato nel 1998, quando lo sviluppatore di software Dave Winer e la sua azienda UserLand Software collaboravano a stretto contatto con Microsoft. Il gigante tecnologico aveva infatti riconosciuto il grande potenziale del nuovo standard per rafforzare le proprie relazioni commerciali B2B. Dotandolo di funzioni più moderne, l’XML-RPC si è affermato anche come protocollo di interfaccia per servizi web, ma con un nome diverso: SOAP (Simple Object Access Protocol).

Come funziona XML-RPC?

I client che desiderano utilizzare XML-RPC ricorrono al protocollo di trasmissione HTTP, più precisamente al relativo metodo di richiesta POST. Dopo aver ricevuto la richiesta HTTP, il server valuta il documento XML che si trova nel corpo della richiesta. Dal suo contenuto genera successivamente il parametro o i parametri per la funzione desiderata e li esegue. Il server comprime il risultato nuovamente in un documento XML, che viene ora rinviato al client come parte di una risposta HTTP. XML-RPC supporta i seguenti tipi di dati per il trasferimento dei parametri, ovvero nella risposta inviata a un client:

Tipo di dato Esempio di tag Descrizione
array <array><data>…</data></array> Sequenza che può contenere più valori o tipi di dati
base64 <base64>SGFsbG8gV2VsdA==</base64> Dati binari codificati in base64
boolean <boolean>1</boolean> Variabile booleana (vero = 1 vs. falso = 0)
dateTime.iso8601 <dateTime.iso8601>20200414T16:23:55</dateTime.iso8601> Data e ora in formato ISO 8601
double <double>-0.32653</double> Numero a virgola mobile in doppia precisione (64 bit)
integer <int>32</int> o <i4>32</i4> Integer (numero intero)
string <string>Ciao, mondo!</string> Stringa di caratteri; può contenere byte nulli
struct <struct><data>…</data></struct> Insieme di membri ognuno dei quali ha un nome e un valore (in questo caso i nomi corrispondono a stringhe, mentre i valori possono essere di qualsiasi tipo)

Se si devono combinare più valori o tipi di dati, potete scegliere tra due opzioni nella notazione XML-RPC, “array” e “struct”. Con la prima opzione, i dati desiderati possono essere elencati uno dopo l’altro in qualsiasi ordine; con “struct” invece al server vengono trasmessi membri di nomi e valori pre-strutturati, come potete vedere nel seguente esempio:

<struct>
    <member>
        <name>Voce 1</name>
        <value><int>1</int></value>
    </member>
    <member>
        <name>Voce 2</name>
        <value><int>2</int></value>
    </member>
</struct>
N.B.

Alcuni linguaggi con implementazioni XML-RPC, come Java, offrono anche la possibilità di specificare valori nulli. Per farlo è necessario utilizzare nel documento XML il tipo di dati “nil”, che tuttavia non forma parte ufficiale della specifica XML-RPC e non è supportato da tutti i server.

In quali contesti si usa XML-RPC?

Nella comunicazione di rete di oggi, il protocollo XML-RPC ha ormai perso terreno. Dopo la sua pubblicazione nel 1998, il formato di scambio si è rapidamente rivelato poco flessibile, in parte a causa della limitata estensibilità e del fatto che non può trasferire strutture XML proprie. La difficile conversione che ne deriva ha reso virtualmente indispensabile lo sviluppo di una soluzione nuova, ovvero SOAP (anch’esso sviluppato dal team di Winer in collaborazione con Microsoft).

Tuttavia, ci sono ancora oggi applicazioni web che utilizzano un’interfaccia XML-RPC al fine, ad esempio, di consentire un semplice scambio di dati con servizi esterni. Un esempio è l’Agenzia delle entrate tedesca, che fornisce un’interfaccia XML-RPC per la verifica automatica delle partite IVA estere (dal 2019 tramite richiesta HTTPS). Anche i sistemi di gestione dei contenuti, come WordPress, utilizzano spesso un’interfaccia XML-RPC per lo scambio con altri servizi web. Il formato di scambio costituisce, inoltre, la base per la cosiddetta tecnica pingback, che è stato per diversi anni uno strumento importante per la creazione di link utilizzato dai blogger (trovate un approfondimento nell’articolo “Cosa sono i pingback e i trackback?”.

Esempio di una richiesta semplice al server con XML-RPC

Infine vi presentiamo un semplice esempio per illustrare la comunicazione tra client e server tramite un’interfaccia XML-RPC. La richiesta HTTP del client è la seguente:

<?xml version="1.0"?>
    <methodCall>
        <methodName>Test di stato</methodName>
        <params>
        <param>
            <value><i4>10</i4></value>
        </param>
        </params>
    </methodCall>

In questo caso, la funzione “Test di stato” viene chiamata nel contenitore “methodCall”, che a sua volta viene definito nel contenitore “methodName”. Come parametro, la funzione trasmette il valore intero “10”.

Una possibile risposta del server a questo “Test di stato” potrebbe apparire così:

<?xml version="1.0"?>
    <methodResponse>
        <params>
        <param>
            <value><string>Stato: OK</string></value>
        </param>
        </params>
    </methodResponse>

La risposta semplice del server in questo esempio è “Stato: OK”.

Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.