Ответ 1
Короткий ответ: оба протокола могут использоваться для выполнения удаленных вызовов процедур (RPC). Оба протокола требуют определения схемы уровня приложения, и, вообще говоря, ни один протокол не требует какой-либо дополнительной схемы для определения того, как сериализовать объекты уровня языка (подробнее см. Ниже).
Тем не менее, XmlRpc пользуется большей поддержкой библиотек, которые используют функции метапрограммирования (отражения) языка для сопоставления вызовов XmlRpc, напрямую (ну, никогда не на 100% напрямую) на вызовы функций уровня языка. Причина в том, что XmlRpc лучше поддерживает XMLRpc, чем простой XML: либо a) историческая авария/результат маркетинга со стороны сторонников XmlRpc, либо (б) сумма незначительных проблем перевода, перечисленных ниже, подсказывает масштабы в пользу XmlRpc.
С другой стороны, XmlRpc страдает от двух основных недостатков: (1) он требует примерно в 4 раза больше полосы пропускания и (2) он подрывает намерение инструментов проверки XML-схемы: каждый пакет будет просто штамповаться как "да, это допустимо XmlRpc", независимо от орфографических ошибок и пропусков в полях уровня приложения.
Длинный ответ:
Вопреки распространенному мнению, вам не нужен стандарт для определения того, как кодировать объекты уровня языка в простом XML - обычно существует только один "разумный" способ (если схема уровня приложения определяет, используете ли вы атрибуты XML или нет), например:
class Room {
int id=1;
String code="MR-101";
String name="Maths room";
int capacity=30;
};
закодирован как:
<Room>
<id>1</id>
<code>MR-101</code>
<name>Maths room</name>
<capacity>30</capacity>
</Room>
XmlRpc был специально разработан для облегчения создания библиотек, которые автоматически сериализуют/несериализуют объекты уровня языка в вызовах RPC и, как таковые, имеют некоторые незначительные преимущества при использовании таким образом:
-
С помощью простого XML можно сгруппировать структуру с одним членом с массивом с одним элементом.
-
XmlRpc определяет стандартный формат времени/даты. {Хотя обработка временных интервалов и чистое время или дата даты с датой даты определяется на уровне приложения.}
-
XmlRpc позволяет передавать аргументы функции без их именования; Для обычных вызовов XML RPC требуется указать каждый аргумент.
-
XmlRpc определяет стандартный способ для имени вызываемого метода: "methodName". С помощью Plain XML тег корня node обычно используется для этой цели, хотя возможны альтернативы.
-
XmlRpc определяет простую систему типов: целые числа, строки и т.д. {Обратите внимание, что со статически типизированными языками типы все равно должны быть скомпилированы в целевой объект и, следовательно, известны и с динамически типизированными языками, часто int и float и строки могут использоваться взаимозаменяемо; также обратите внимание, что система типа XmlRpc обычно будет плохо соответствовать системе типов целевого языка, которая может иметь несколько целых типов и т.д.}
-
Библиотеки XmlRpc обычно интегрируются непосредственно с библиотекой Http, тогда как библиотеки сериализации Xml все (?) требуют, чтобы программист приложения передавал XML-текст в Http-вызов. В более современных языках, таких как Java/Python/С#, это тривиальный вопрос, но не так, например. С++.
-
Существует "маркетинговое восприятие", которое XML описывает "документы", тогда как XmlRpc предназначен для вызовов процедур. Понимание состоит в том, что отправка сообщения XmlRpc содержит обязательство для сервера выполнять какое-либо действие, тогда как это восприятие не столь сильное с простым XML.
Некоторые люди скажут "кто заботится - синтаксический анализ XML-данных с использованием рекурсивного спуска /DOM/SAX довольно легко в любом случае" , и в этом случае большинство вышеперечисленных возражений не имеют значения.
Для тех, кто по-прежнему предпочитает легко использовать создание объектов родного языка, созданных автоматически, на многих основных языках есть библиотеки, которые автоматически сериализуют объекты уровня языка в XML, не прибегая к XmlRpc, например:
Возможно, успех XmlRpc, например, связан с наличием библиотек, которые автоматически создают объекты уровня языка, и, в свою очередь, эти библиотеки имеют преимущество перед своими обычными XML-коллегами из-за списка выше.
Недостатками XmlRpc являются:
-
Как упоминалось в вопросе, это ужасно ожирение
-
Поддержка простого XML вездесуща и обычно не требует интеграции с большими сторонними библиотеками. Многие приложения требуют преобразования автоматически создаваемых объектов в собственные объекты приложения.
-
Многие реализации XmlRpc не могут создавать истинные объекты уровня языка, которые программисты сортировки ожидали бы и требовали, например, временные запросы полей или дополнительный синтаксис.
-
Если для проверки вызовов RPC, например DTD файла, используется документ определения схемы, то вы теряете возможность проверки схемы уровня приложения - файл DTD просто скажет вам, что "это действительно XmlRpc". Насколько мне известно, стандартный способ определения схемы уровня приложения с протоколом на основе XmlRpc.