2009-09-04 18 views
15

Mi empresa ha estado usando XML-RPC por un tiempo, pero últimamente me pregunto cuál es el beneficio de XML-RPC en comparación con XML simple. En primer lugar, es horrible "obeso", tenga en cuenta:¿Cuál es el beneficio de XML-RPC sobre XML simple?

<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> 

En comparación con esto:

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

O incluso esto:

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

En segundo lugar, XML-RPC parece bastante extendida, pero no del todo omnipresente y no estoy tan impresionado con el apoyo en C++ y PHP. He tenido problemas con todas las bibliotecas que probé en ambos idiomas.

En tercer lugar, me parece que podría realizar llamadas a procedimientos remotos con XML simple tan fácilmente como con XML-RPC. {(9/9/2009): Todos los idiomas tienen bibliotecas para serializar objetos de nivel de lenguaje en XML. Tanto XML como XML-RPC requieren que se definan esquemas de nivel de aplicación, por ejemplo, cómo deben escribirse los campos, pero ninguno necesita ningún esquema adicional para definir. Muchas personas realizan llamadas RPC con XML sin formato.}

¿Cuál es el valor agregado de XML-RPC?

Respuesta

18

La respuesta corta es: Ambos protocolos se pueden utilizar para hacer llamadas a procedimiento remoto (RPC). Ambos protocolos requieren un esquema de nivel de aplicación para ser definido, y en términos generales, ninguno de los protocolos requiere ningún esquema adicional para definir cómo serializar los objetos de nivel de lenguaje (ver más abajo algunos detalles).

Sin embargo, XmlRpc goza de una mayor compatibilidad de las bibliotecas que utilizan características de meta-programación (reflexión) del lenguaje para asignar llamadas XmlRpc, directamente (bueno, nunca 100% directamente) a llamadas a funciones de nivel de lenguaje. La razón por la cual hay mejor soporte para XmlRpc que XML simple es (a) un accidente histórico/resultado de marketing por parte de los proponentes de XmlRpc, o (b) la suma de los problemas menores de traducción enumerados a continuación inclinan la balanza a favor de XmlRpc.

Por otro lado, XmlRpc adolece de dos desventajas principales: (1) requiere aproximadamente 4 veces más ancho de banda, y (2) subvierte la intención de las herramientas de validación de esquemas XML: cada paquete simplemente se marcará como "sí, esto es XmlRpc válido", independientemente de los errores de ortografía y las omisiones en los campos de nivel de aplicación.

La respuesta larga:

Contrariamente a la creencia popular, no es necesario un estándar para definir cómo codificar objetos de nivel de idioma en XML sin formato - en general hay sólo una manera de "sensible" (siempre que el nivel de aplicación esquema define si se utiliza atributos XML o no), por ejemplo:

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

codificados como:

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

XmlRpc fue diseñado específicamente para facilitat e la creación de bibliotecas que serializar automáticamente objetos de nivel de idioma/unserialise en llamadas RPC, y como tal tiene algunas ventajas menores cuando se usa de esta manera:

  1. Con XML sin formato, es posible que una estructura con una miembro único que se debe confundir con una matriz con un solo elemento.

  2. XmlRpc define un formato de hora/fecha estándar. {Aunque el tratamiento de las zonas horarias y las marcas de tiempo de fecha y hora pura se define en el nivel de aplicación.}

  3. XmlRpc le permite pasar argumentos a la función sin nombrarlos; Las llamadas RPC XML simples requieren que nombre cada argumento.

  4. XmlRpc define una forma estándar para nombrar el método que se llama: "methodName". Con Plain XML, la etiqueta del nodo raíz normalmente se utilizará para este fin, aunque las alternativas son posibles.

  5. XmlRpc define un sistema de tipo simple: números enteros, cadenas, y así sucesivamente.{Tenga en cuenta que con los lenguajes tipados estáticamente, los tipos deben compilarse en el objeto de destino de todos modos, y por lo tanto son conocidos, y con los lenguajes tipados dinámicamente, a menudo las cadenas int y float se pueden usar indistintamente; tenga en cuenta también que el sistema de tipo XmlRpc normalmente no coincidiría lo suficiente con el sistema de tipos del idioma de destino que puede tener múltiples tipos enteros, etc.}

  6. Las bibliotecas XmlRpc generalmente se integran directamente con una biblioteca Http, mientras que Xml todas las bibliotecas de serialización (?) requieren que el programador de aplicaciones pase el texto XML a la llamada Http. En idiomas más modernos como Java/Python/C#, este es un tema trivial, pero no así para, por ejemplo, C++.

  7. hay una "percepción de marketing" que describe XML "documentos", mientras que XmlRpc está diseñado para llamadas de procedimiento. La percepción es que enviar un mensaje XmlRpc contiene una obligación para el servidor de realizar alguna acción, mientras que esta percepción no es tan fuerte con XML simple.

Algunos dirán "a quién le importa - analizar los datos XML utilizando descendente recursivo/DOM/SAX es bastante fácil de todos modos", en cuyo caso la mayor parte de las objeciones anteriores son irrelevantes.

Para aquellos que todavía prefieren la facilidad de uso de conseguir objetos de lenguaje nativo creado automáticamente, muchas de las principales lenguas tienen bibliotecas que serializar automáticamente objetos de nivel de idioma en XML sin tener que recurrir a XmlRpc, por ejemplo:

.NET - Java - Python

puede ser que el éxito de XmlRpc, tal como es, se deriva de la disponibilidad de las bibliotecas que crean automáticamente objetos de nivel de idioma, ya su vez estas bibliotecas tienen una ventaja sobre sus homólogos XML lisos debido al li San de los problemas anteriores.

desventajas de XmlRpc son:

  • Como se menciona en la pregunta, que es terriblemente obesos

  • soporte para XML llano es ubicua y por lo general no requiere integración con bibliotecas 3 ª parte grandes. Muchas aplicaciones requieren una conversión de los objetos creados automáticamente a los objetos de la aplicación de todos modos.

  • Muchas implementaciones xmlrpc no producen verdaderos objetos de nivel de lenguaje de los programadores ordenar esperaría, y en su lugar, por ejemplo, requerirá búsquedas en tiempo de ejecución de campos o sintaxis adicional.

  • Si se utiliza un documento de definición de esquema para validar las llamadas RPC, como un archivo DTD, se pierde la capacidad de verificar el esquema de nivel de aplicación; el archivo DTD simplemente le dirá que "esto es XmlRpc válido" ". No tengo conocimiento de ninguna forma estándar para definir un esquema de nivel de aplicación con un protocolo basado en XmlRpc.

1

Empezaré por el final y vaya hacia atrás:

3) Sí, se puede hacer llamadas a procedimientos remotos con XML simple (o cadenas de fricción, o protocolo binario). La diferencia es que XmlRpc es un protocolo bien definido con muchas implementaciones disponibles, lo que significa que a) usted no tiene que escribir tanto código yb) usted puede interoperar con quien sea que esté en el otro extremo del cable sin usted o ellos tienen que lidiar con el código del otro. XmlRpc sirve como un puente.

2) Diría que es quite ubiquitous :-) He trabajado con XmlRpc en Java, así que no puedo comentar sobre problemas de implementación de C++/PHP.

1) es debido a (3) anterior. La verbosidad del protocolo es tanto la consecuencia como la razón de su interoperabilidad.

+0

3) Si tuviera que realizar llamadas a procedimientos remotos con cadenas simples o binarias, esto sería horrible y requeriría diseñar formatos para cada interacción. Pero XML simple proporciona un formato bien definido para pasar valores estructurados. No creo que hayas respondido a la pregunta "¿qué tiene XmlRpc sobre XML?" 1) Mis ejemplos comparan XmlRpc con XML, y prueban que no necesita ser prolijo para ser interoperable. XML se considera un protocolo que es bueno para la interoperabilidad. –

+0

Estás equivocado. Tomando su ejemplo, '' ¿Cómo sabría cómo deshacer eso en un objeto si tuviera que recibir esto a través de un cable? No es diferente de obtener, digamos, 'room | 1 | MR-101 | Math Room | 30' y confiar en el orden de los campos. El punto es que XML-RPC proporciona un ** protocolo de comunicación bien definido ** - XML ​​por sí mismo no lo hace. – ChssPly76

+0

No entiendo el punto de confiar en el orden de campo. En este caso, los atributos (o etiquetas) tienen nombres. ¿Por qué no miras los nombres de los campos en lugar del orden de los campos? –

10

La principal ventaja es que alguien ya resolvió el esquema de llamadas por usted. Esto es especialmente útil en los lenguajes con reflexión, donde se puede pasar ciegamente, digamos, una estructura complicada a la llamada RPC, y encontrará la manera de traducir eso en XML para usted. Es menos valioso en, por ejemplo, C++, donde debe decirle a la biblioteca XML-RPC cuáles son los tipos de datos explícitos.

Tienes razón en que no ha tomado el mundo por sorpresa. Las rarezas que está encontrando en las bibliotecas se deben a este bajo nivel de interés. He usado dos yo mismo, y encontré errores en ambos. Y ambos eran abandonware, por lo que no puedo enviar parches a ninguna parte, así que tengo versiones privadas parcheadas de ambos. Suspiro.

+0

Warren, si es posible utilizar la reflexión para serializar estructuras de datos en XmlRpc, ¿no es posible utilizar el reflejo para serializar estructuras de datos en XML simple? –

+0

Por supuesto, pero usted tiene que escribir todo ese código de serialización usted mismo, y ahora ha inventado otro esquema XML propietario. Hay algo que decir por simplicidad y compatibilidad. –

+0

"Otro esquema de propiedad" - eso implica que hay más de una forma de codificar objetos en XML. En el ejemplo anterior, si simplemente no permitimos atributos, entonces seguramente solo hay una forma de codificar el objeto. No está inventando más "esquema de propiedad". De hecho, ya hay bibliotecas para serializar objetos en XML simple para C# y PHP, y probablemente para la mayoría de los idiomas. –

2

El valor principal de XmlRpc es que no es necesario escribir el código para generar y analizar los documentos XML que se pasan a través de HTTP, ya que XML-RPC es un esquema XML predefinido para representar llamadas de función.

Incluso con bibliotecas menos que óptimas, existe un valor derivado adicional ya que el uso de este tipo de sistema le permite definir sus interfaces remotas como interfaces de lenguaje básico (Clase abstracta C++, interfaces Java, etc.), que son independientes de el protocolo de cable utilizado para comunicarse entre componentes.

La separación de las definiciones de interfaz del protocolo de cable (XML-RPC, SOAP, etc.) le permite sustituir finalmente en protocolos alternativos cuando sea apropiado. Por ejemplo, en nuestro sistema, tenemos servicios que están expuestos usando Hessian para nuestros frontales Flex y SOAP para nuestros frontales .NET (la biblioteca .Net de Hessian tiene una licencia no permitida).

Al seguir con XML-RPC Ahora, usted tiene la opción de cambiar a algún otro protocolo en el futuro con cantidades mínimas de refactorización.

+0

Con XML simple, no hay necesidad de escribir código para generar y analizar documentos XML. Encontré fácilmente enlaces a bibliotecas que ya hacen esto para C# y PHP exactamente de la misma manera que las bibliotecas hacen esto para XmlRpc. Si tuviera un código que hiciera XML, entonces no estaría interesado en una API de protocolo de varios hilos. –

2

Fácil: XML RPC ofrece

  • una forma estándar para pasar el nombre del método
  • un sistema de tipificación. Trabajo con números de teléfono con bastante frecuencia, son cadenas, NO números.
  • una forma estándar para devolver errores
  • introspección (casi) gratis

Todo esto sobre el estándar XML.

Cuestiones relacionadas