Quel est l'avantage de XML-RPC par rapport au XML simple?

Mon entreprise a été à l'aide de XML-RPC pour un certain temps, mais récemment, je me demandais quels étaient les avantages de XML-RPC par rapport à la plaine de XML. Tout d'abord, il est horrible "obèse", envisager:

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

par Rapport à ceci:

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

Ou encore:

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

Deuxièmement, XML-RPC semble assez répandu mais pas tout à fait omniprésent et je ne suis pas très impressionné par le support pour cela en C++ et PHP. J'ai eu des problèmes avec toutes les bibliothèques que j'ai essayées. les deux langues.

troisièmement, il me semble que je pourrais faire des appels de procédure à distance avec du XML simple aussi facilement qu'avec du XML-RPC. {(9/9/2009): chaque langue dispose de bibliothèques pour sérialiser les objets au niveau de la langue en XML. Le XML et le XML-RPC exigent tous deux que les schémas au niveau de l'application soient définis, par exemple, comment les champs devraient être épelés, mais ni l'un ni l'autre n'a besoin de schéma supplémentaire à définir. Beaucoup de gens font des appels RPC avec du XML simple.}

Alors, quelle est la valeur ajoutée de XML-RPC?

15
demandé sur Peter Mortensen 2009-09-04 04:32:19

5 réponses

la réponse courte est: les deux protocoles peuvent être utilisés pour faire des appels de procédure à distance (RPC). Les deux protocoles exigent la définition d'un schéma au niveau de l'application et, d'une manière générale, aucun des deux protocoles n'exige de schéma supplémentaire pour définir la façon de sérialiser les objets au niveau de la langue (voir ci-dessous pour plus de détails).

cependant, XmlRpc bénéficie d'un plus grand soutien de la part des bibliothèques qui utilisent des fonctionnalités de méta-programmation (réflexion) du langage pour cartographier les appels XmlRpc, directement (Eh bien, jamais 100% directement) au niveau de la langue appels de fonction. La raison pour laquelle il y a un meilleur support pour XMLRPC que le XML simple est (a) un accident/résultat historique de marketing de la part des promoteurs de XmlRpc, ou (b) la somme des problèmes mineurs de traduction énumérés ci-dessous fait pencher la balance en faveur de XmlRpc.

d'un autre côté, XmlRpc souffre de 2 inconvénients principaux: (1) Il nécessite environ 4 fois plus de bande passante, et (2) Il subvertit l'intention du schéma XML-validation outils: chaque paquet sera simplement estampillé comme "oui, c'est valable XmlRpc", indépendamment de fautes d'orthographe et d'omissions dans l'application-niveau de champs.

La réponse longue:

contrairement à la croyance populaire, vous n'avez pas besoin d'une norme pour définir comment encoder des objets de niveau de langage en XML simple - il n'y a généralement qu'une seule façon "raisonnable" (à condition que le schéma du niveau de l'application définisse si vous utilisez des attributs XML ou non), par exemple:

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

codé comme:

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

XmlRpc a été spécialement conçu pour faciliter la création de bibliothèques qui sérialisent/désérialisent automatiquement les objets au niveau de la langue dans les appels RPC, et en tant que tel, il a quelques avantages mineurs lorsqu'il est utilisé de cette façon:

  1. avec XML simple, il est possible qu'une structure avec un seul membre soit confondue avec un tableau avec un seul élément.

  2. xmlrpc définit un format Heure/date standard. {Bien que le traitement des horodateurs et des horodateurs purs ou purs sont définis au niveau de l'application.}

  3. XmlRpc vous permet de passer des arguments à la fonction sans les nommer; les appels RPC XML simples exigent que vous nommiez chaque argument.

  4. XmlRpc définit une méthode standard pour nommer la méthode appelée: "methodName". Avec le XML simple, la balise du noeud racine serait généralement utilisé à cette fin, bien que les alternatives sont possible.

  5. XmlRpc définit un système de type simple: entiers, chaînes, et ainsi de suite. {Notez qu'avec les langages statiquement typés, les types doivent être compilés dans l'objet destination de toute façon, et sont donc connus, et avec les langages dynamiquement typés, souvent int's et float's et les chaînes peuvent être utilisés de façon interchangeable; notez également que le système de type XmlRpc serait typiquement une mauvaise correspondance pour le système de type de la langue de destination qui peut avoir plusieurs integer types, et ainsi de suite.}

  6. il existe une" perception de marketing "selon laquelle XML décrit les" documents", alors que XmlRpc est conçu pour les appels de procédure. Le la perception est que l'envoi d'un message XmlRpc contient une obligation pour le serveur d'effectuer une certaine action, alors que cette perception n'est pas aussi forte avec du XML simple.

certains diront "qui s'en soucie - l'analyse des données XML à l'aide de descente récursive/DOM/SAX est assez facile de toute façon", auquel cas la plupart des objections ci-dessus ne sont pas pertinentes.

pour ceux qui préfèrent encore la facilité d'utilisation d'obtenir des objets de langue maternelle créés automatiquement, de nombreuses langues principales ont des bibliothèques qui sérialisent automatiquement les objets au niveau de la langue en XML sans recourir à XmlRpc, par exemple:

.NET - Java - Python

il se peut que le succès de XmlRpc, tel qu'il est, découle de la disponibilité des bibliothèques qui créent automatiquement des objets au niveau du langage, et à leur tour ces bibliothèques ont un avantage sur leurs homologues XML simples en raison de la la liste de questions ci-dessus.

  • la prise en charge du XML simple est omniprésente et ne nécessite généralement pas d'intégration avec les bibliothèques de tiers de grande taille. De nombreuses applications nécessitent de toute façon une conversion des objets créés automatiquement en objets propres à l'application.

  • de nombreuses implémentations xmlrpc ne produisent pas les vrais objets au niveau du langage des programmeurs de tri s'attendraient et au lieu de cela exigeraient par exemple des recherches de champs ou une syntaxe supplémentaire.

  • si un document de définition de schéma est utilisé pour valider les appels RPC, tel qu'un fichier DTD, alors vous perdez la possibilité de vérifier le schéma au niveau de l'application-le fichier DTD vous dira simplement que "ceci est valide XmlRpc". Il n'y a pas, à ma connaissance, de manière standard pour définir un schéma au niveau de l'application avec un xmlrpc basé protocole.

18
répondu Tim Cooper 2010-09-14 06:01:53

le principal avantage est que quelqu'un a déjà élaboré le schéma d'appel pour vous. Cela est particulièrement utile dans les langues avec réflexion, où vous pouvez simplement passer aveuglément, disons, une structure compliquée à l'appel RPC, et il va travailler sur la façon de traduire cela en XML pour vous. C'est moins utile en, disons, C++, où vous devez dire à la bibliothèque XML-RPC ce que tous les types de données sont explicitement.

Vous avez raison, il n'a pas pris le monde par la tempête. Le les bizarreries que vous trouvez dans les bibliothèques sont dues à ce faible niveau d'intérêt. J'en ai utilisé deux moi-même, et j'ai trouvé des insectes dans les deux. Et les deux étaient des abandonware, donc il n'y a nulle part où je pourrais renvoyer des patches, donc j'ai des versions patchées privées des deux. Soupir.

10
répondu Warren Young 2009-09-04 00:46:09

la principale valeur de XmlRpc est que vous n'avez pas à écrire le code pour générer et analyser les documents XML transmis par HTTP, puisque XML-RPC est un schéma XML prédéfini pour représenter les appels de fonction.

même avec des bibliothèques moins qu'optimales, il y a une valeur dérivée supplémentaire puisque l'utilisation de ce type de système vous permet de définir vos interfaces distantes comme des interfaces de langage de base (classe abstraite C++, interfaces Java, etc.), qui sont indépendants de la fil protocole utilisé pour communiquer entre les composants.

séparer les définitions d'interface du protocole wire (XML-RPC, SOAP,etc.) vous permet, éventuellement, de remplacer dans d'autres protocoles, le cas échéant. Par exemple, dans notre système, nous avons des services qui sont exposés en utilisant Hesse pour nos têtes frontales Flex, et SOAP pour nos têtes frontales .NET (la bibliothèque Hessian .Net a une licence refusée).

en restant avec XML-RPC maintenant, vous avez l'option de passer à un autre protocole à l'avenir avec un minimum de remaniement.

2
répondu John Stauffer 2009-09-04 00:47:19

Facile: XML RPC fournit

  • une façon standard de passer le nom de la méthode
  • un système de typage. Je travaille souvent avec des numéros de téléphone, ce sont des ficelles, pas des numéros.
  • une façon standard de retourner les erreurs
  • introspection (presque) gratuitement

tout cela sur XML standard.

2
répondu Mauvaisours 2010-10-19 07:55:20

Permettez-moi de commencer par la fin et revenir en arrière:

3) Oui, vous pouvez faire des appels de procédure à distance avec du XML simple (ou des chaînes simples, ou un protocole binaire). La différence est que XmlRpc est un protocole bien défini avec de nombreuses implémentations disponibles, ce qui signifie a) que vous n'avez pas à écrire autant de code et b) que vous pouvez interférer avec qui que ce soit à l'autre bout du fil sans que vous ou eux n'ayez à composer avec le code de l'autre. XmlRpc Sert de pont.

2) Je dirais que c'est tout à fait omniprésente: -) j'ai travaillé avec xmlrpc en Java, donc je ne peux pas commenter les problèmes D'implémentation C++ / PHP.

1) est due à (3) ci-dessus. Verbosité du protocole est à la fois la conséquence et le motif de son interopérabilité.

1
répondu ChssPly76 2009-09-04 00:45:49