2009-09-04 15 views
15

La mia azienda ha utilizzato XML-RPC per un po ', ma ultimamente mi chiedo quale sia il vantaggio di XML-RPC rispetto al semplice XML. In primo luogo, è orribile "obesi", prendere in considerazione:Qual è il vantaggio di XML-RPC su XML semplice?

<struct> 
    <member> 
     <name>ROOM_ID</name> 
     <value> 
      <int>1</int> 
     </value> 
    </member> 

    <member> 
     <name>CODE</name> 
     <value> 
      <string>MR-101</string> 
     </value> 
    </member> 

    <member> 
     <name>NAME</name> 
     <value> 
      <string>Math Room</string> 
     </value> 
    </member> 

    <member> 
     <name>CAPACITY</name> 
     <value> 
      <int>30</int> 
     </value> 
    </member> 
</struct> 

Rispetto a questo:

<room><ROOM_ID>1</ROOM_ID><CODE>MR-101</CODE> 
<NAME>Math Room</NAME><CAPACITY>30</CAPACITY></room> 

O anche questo:

<room ROOM_ID=1 CODE=MR-101 NAME=”Math Room” CAPACITY=30 /> 

In secondo luogo, XML-RPC sembra abbastanza diffusa, ma non del tutto onnipresente e non mi ha colpito il supporto in C++ e PHP. Ho avuto problemi con tutte le librerie che ho provato in entrambe le lingue.

In terzo luogo, mi sembra di poter effettuare chiamate di procedura remota con XML semplice con la stessa facilità con XML-RPC. {(9/9/2009): Ogni lingua dispone di librerie per la serializzazione di oggetti a livello di linguaggio in XML. Sia XML che XML-RPC richiedono la definizione di schemi a livello di applicazione, ad esempio, come devono essere scritti i campi, ma non è necessario definire alcuno schema aggiuntivo. Molte persone effettuano chiamate RPC con XML semplice.}

Quindi qual è il valore aggiunto di XML-RPC?

risposta

18

La risposta breve è: entrambi i protocolli possono essere utilizzati per effettuare chiamate di procedura remota (RPC). Entrambi i protocolli richiedono la definizione di uno schema a livello di applicazione e, in generale, nessuno dei protocolli richiede alcuno schema aggiuntivo per definire come serializzare gli oggetti a livello di linguaggio (vedere sotto per alcuni dettagli).

Tuttavia, XmlRpc gode di un maggiore supporto da librerie che utilizzano le funzionalità di metaprogrammazione (riflessione) del linguaggio per mappare le chiamate XmlRpc, direttamente (beh, mai al 100% direttamente) alle chiamate di funzione a livello di lingua. Il motivo per cui esiste un supporto migliore per XmlRpc rispetto al semplice XML è (a) un incidente storico/risultato del marketing da parte dei sostenitori di XmlRpc, o (b) la somma dei problemi di traduzione minori elencati sotto punta le scale a favore di XMLRPC.

D'altra parte, XmlRpc soffre di 2 svantaggi principali: (1) richiede circa 4 volte la larghezza di banda e (2) sovverte l'intento degli strumenti di convalida dello schema XML: ogni pacchetto verrà semplicemente timbrato come "sì, è valido XmlRpc", indipendentemente dagli errori di ortografia e dalle omissioni nei campi a livello di applicazione.

La risposta lunga:

Contrariamente alla credenza popolare, non è necessario uno standard per definire come codificare oggetti di livello linguaggio XML semplice - v'è generalmente solo un modo "sensibili" (a condizione che il livello di applicazione schema definisce se usate gli attributi XML o non), ad esempio:

class Room { 
    int id=1; 
    String code="MR-101"; 
    String name="Maths room"; 
    int capacity=30; 
}; 

codificati come:

<Room> 
    <id>1</id> 
    <code>MR-101</code> 
    <name>Maths room</name> 
    <capacity>30</capacity> 
</Room> 

XMLRPC è stato specificamente progettato per agevolarne e la creazione di librerie che puntate automaticamente/oggetti unserialise livello lingua in chiamate RPC, e come tale ha alcuni vantaggi minori quando usato in questo modo:

  1. Con XML pianura, è possibile che una struttura con un membro singolo da confondere con un array con un singolo elemento.

  2. XmlRpc definisce un formato orario/data standard. {Anche se il trattamento di fusi orari e tempo puro o data/ora pura è definito a livello di applicazione.}

  3. XmlRpc consente di passare argomenti alla funzione senza nominarli; Le normali chiamate RPC XML richiedono che il nome di ogni argomento.

  4. XmlRpc definisce un metodo standard per denominare il metodo chiamato "metodoName". Con Plain XML, il tag del nodo radice verrebbe tipicamente usato per questo scopo, sebbene siano possibili alternative.

  5. XmlRpc definisce un sistema di tipo semplice: numeri interi, stringhe e così via.{Si noti che con linguaggi tipizzati staticamente, i tipi devono essere compilati comunque nell'oggetto di destinazione, e quindi sono noti, e con linguaggi tipizzati dinamicamente, spesso int e float e stringhe possono essere usati in modo intercambiabile; si noti inoltre che il sistema di tipo XmlRpc in genere non corrisponde al tipo di sistema della lingua di destinazione che può avere più tipi di interi e così via.}

  6. Le librerie XmlRpc generalmente si integrano direttamente con una libreria Http, mentre Xml tutte le librerie di serializzazione (?) richiedono al programmatore dell'applicazione di passare il testo XML alla chiamata Http. Nei linguaggi più moderni come Java/Python/C#, questo è un aspetto banale, ma non così per es. C++.

  7. Esiste una "percezione di marketing" che XML descrive "documenti", mentre XmlRpc è progettato per le chiamate di procedura. La percezione è che l'invio di un messaggio XmlRpc contenga l'obbligo per il server di eseguire alcune azioni, mentre questa percezione non è così forte con il semplice XML.

Alcune persone dicono "chi se ne frega - analisi dei dati XML utilizzando ricorsiva discesa/DOM/SAX è abbastanza facile in ogni caso", nel qual caso la maggior parte delle obiezioni di cui sopra sono irrilevanti.

Per chi preferisce ancora la facilità d'uso di ottenere oggetti linguaggio nativi creati automaticamente, molte lingue importanti hanno librerie che puntate automaticamente oggetti a livello di lingua in XML senza ricorrere a XMLRPC, ad esempio:

.NET - Java - Python

può essere che il successo di XMLRPC, così com'è, deriva dalla disponibilità delle librerie che creano automaticamente oggetti a livello di linguaggio, e, a sua volta queste librerie hanno un vantaggio rispetto ai loro omologhi XML semplici dovuti al li st dei problemi di cui sopra.

Svantaggi di XMLRPC sono:

  • Come accennato in questione, non è terribilmente obeso

  • supporto per XML pianura è onnipresente e di solito non richiede l'integrazione con grandi biblioteche 3rd party. Molte applicazioni richiedono comunque una conversione degli oggetti creati automaticamente sugli oggetti dell'applicazione stessa.

  • Molte implementazioni XmlRpc non riescono a produrre veri oggetti a livello di linguaggio dei programmatori di ordinamento che si aspetterebbero e invece richiedono ad es. ricerche run-time di campi o sintassi extra.

  • Se un documento di definizione dello schema viene utilizzato per convalidare le chiamate RPC, come un file DTD, allora si perde la possibilità di controllare lo schema a livello di applicazione - il file DTD ti dirà semplicemente che "questo è XmlRpc valido ". Non è a mia conoscenza un modo standard per definire uno schema a livello di applicazione con un protocollo basato su XmlRpc.

1

Vorrei iniziare dalla fine e tornare indietro:

3) Sì, si potrebbe fare chiamate di procedura remota con XML semplice (o stringhe semplici, o protocollo binario). La differenza è che XmlRpc è un protocollo ben definito con molte implementazioni disponibili, il che significa a) non devi scrivere tanto codice eb) puoi interagire con chiunque sia all'altro capo del filo senza tu o loro avete a che fare con il codice dell'altro. XmlRpc funge da ponte.

2) Direi che è quite ubiquitous :-) Ho lavorato con XmlRpc in Java, quindi non posso commentare problemi di implementazione C++/PHP.

1) è dovuto a (3) sopra. La verbosità del protocollo è sia la conseguenza sia la ragione della sua interoperabilità.

+0

3) Se dovessi effettuare chiamate di procedura remota con semplici stringhe o binari, ciò sarebbe orribile e richiede la progettazione di formati per ogni interazione. Ma l'XML semplice fornisce un formato ben definito per il passaggio di valori strutturati. Non penso che tu abbia risposto alla domanda "che cosa XmlRpc ha su XML?" 1) I miei esempi confrontano XmlRpc con XML e dimostrano che non è necessario essere prolissi per essere interoperabili. XML è considerato un protocollo che è buono per l'interoperabilità. –

+0

Ti stai sbagliando. Prendendo il tuo esempio, '' come faccio a sapere come eliminarlo in un oggetto se lo ricevessi su un filo? Non è diverso da ottenere, per esempio, 'room | 1 | MR-101 | Math Room | 30' e fare affidamento sull'ordine dei campi. Il punto è che XML-RPC fornisce un ** protocollo di comunicazione ben definito ** - XML ​​di per sé no. – ChssPly76

+0

Non capisco il punto sul fatto di fare affidamento sull'ordine dei campi. In questo caso, gli attributi (o tag) hanno nomi. Perché non dovresti guardare i nomi dei campi piuttosto che l'ordine dei campi? –

10

Il vantaggio principale è che qualcuno ha già elaborato lo schema di chiamata per te. Ciò è particolarmente utile nelle lingue con la riflessione, dove puoi passare ciecamente, ad esempio, una struttura complicata alla chiamata RPC, e capire come tradurre ciò in XML per te. È meno utile, ad esempio, in C++, dove devi dire alla libreria XML-RPC quali sono tutti i tipi di dati esplicitamente.

Hai ragione che non ha preso d'assalto il mondo. Le stranezze che trovi nelle biblioteche sono dovute a questo basso livello di interesse. Ne ho usato due io e ho trovato bug in entrambi. Ed entrambi erano abandonware, quindi non c'è nessun posto dove potrei inviare patch, quindi ho versioni private di patch di entrambi. Sospiro.

+0

Warren, se è possibile utilizzare il reflection per serializzare strutture di dati in XmlRpc, non è possibile utilizzare la reflection per serializzare strutture di dati in un semplice XML? –

+0

Ovviamente, ma devi scrivere tutto questo codice di serializzazione e ora hai inventato un altro schema XML proprietario. C'è qualcosa da dire per semplicità e compatibilità. –

+0

"Un altro schema proprietario" - questo implica che esistono più modi di codificare gli oggetti in XML. Nell'esempio sopra, se semplicemente disabilitiamo gli attributi, sicuramente c'è solo un modo per codificare l'oggetto? Non sta inventando altro "schema proprietario". In effetti, esistono già librerie per serializzare oggetti in un semplice XML per C# e PHP, e probabilmente per la maggior parte delle lingue. –

2

Il valore primario di XmlRpc è che non è necessario scrivere il codice per generare e analizzare i documenti XML passati su HTTP, poiché XML-RPC è uno schema XML predefinito per la rappresentazione delle chiamate di funzione.

Anche con librerie meno che ottimali, esiste un valore derivato aggiuntivo poiché l'uso di questo tipo di sistema consente di definire le interfacce remote come interfacce di linguaggio di base (classe astratta C++, interfacce Java, ecc.), Che sono indipendenti da il protocollo filo utilizzato per comunicare tra i componenti.

La separazione delle definizioni di interfaccia dal protocollo del filo (XML-RPC, SOAP, ecc.) Consente di sostituire eventualmente i protocolli alternativi laddove appropriato. Ad esempio, nel nostro sistema, disponiamo di servizi esposti utilizzando Hessian per i front end Flex e SOAP per i front end .NET (la libreria .Net di Hessian ha una licenza non consentita).

Attaccando ora con XML-RPC, è possibile passare a un altro protocollo in futuro con quantità minime di refactoring.

+0

Con XML semplice, non è necessario scrivere codice per generare e analizzare documenti XML. Ho trovato facilmente collegamenti a librerie che già lo fanno per C# e PHP esattamente nello stesso modo in cui le librerie lo fanno per XmlRpc. Se avessi codice che facesse XML allora non sarei interessato a un'API multi-wire-protocol. –

2

Facile: RPC XML fornisce

  • un modo standard per passare il nome del metodo
  • un sistema di digitazione. Lavoro spesso con i numeri di telefono, quelli sono stringhe, NON numeri.
  • un modo standard per restituire errori
  • introspezione (quasi) gratis

Tutto questo su standard XML.

Problemi correlati