В чем преимущество XML-RPC по сравнению с обычным XML?

Моя компания некоторое время использует XML-RPC, но в последнее время мне интересно, что преимущество XML-RPC по сравнению с обычным XML. Во-первых, это жуткое "ожирение", учтите:

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

По сравнению с этим:

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

Или даже это:

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

Во-вторых, XML-RPC кажется довольно распространенным, но не вездесущим, и меня не впечатляет его поддержка в C++ и PHP. У меня были проблемы со всеми библиотеками, которые я пробовал на обоих языках.

В-третьих, мне кажется, что я мог бы выполнять удаленные вызовы процедур с помощью простого XML так же легко, как с помощью XML-RPC. {(9 сентября 2009 г.): В каждом языке есть библиотеки для сериализации объектов языкового уровня в XML. Как XML, так и XML-RPC требуют определения схем на уровне приложения, например, как должны записываться поля, но ни для того, ни для другого не требуется определения какой-либо дополнительной схемы. Многие люди выполняют вызовы RPC с помощью простого XML.}

Так в чем же заключается добавленная стоимость XML-RPC?


person Tim Cooper    schedule 04.09.2009    source источник


Ответы (5)


Короткий ответ: оба протокола можно использовать для выполнения удаленных вызовов процедур (RPC). Оба протокола требуют определения схемы на уровне приложения, и, вообще говоря, ни один из протоколов не требует какой-либо дополнительной схемы для определения того, как сериализовать объекты на уровне языка (некоторые подробности см. ниже).

Однако XmlRpc пользуется большей поддержкой со стороны библиотек, которые используют функции метапрограммирования (рефлексии) языка для сопоставления вызовов XmlRpc напрямую (ну, никогда не на 100% напрямую) с вызовами функций на уровне языка. Причина лучшей поддержки XmlRpc, чем простой XML, заключается либо в (а) исторической случайности/результате маркетинга со стороны сторонников XmlRpc, либо (б) сумме незначительных проблем с переводом, перечисленных ниже, склоняющих чашу весов в пользу XmlRpc.

С другой стороны, XmlRpc имеет 2 основных недостатка: (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, и поэтому при таком использовании он имеет некоторые незначительные преимущества:

  1. В простом XML структуру с одним членом можно спутать с массивом с одним элементом.

  2. XmlRpc определяет стандартный формат времени/даты. {Хотя обработка часовых поясов и временных меток чистого времени или чистой даты определяется на уровне приложения.}

  3. XmlRpc позволяет передавать аргументы функции, не называя их; Обычные вызовы XML RPC требуют, чтобы вы назвали каждый аргумент.

  4. XmlRpc определяет стандартный способ именования вызываемого метода: «methodName». В обычном XML для этой цели обычно используется тег корневого узла, хотя возможны и альтернативные варианты.

  5. XmlRpc определяет простую систему типов: целые числа, строки и т. д. {Обратите внимание, что в языках со статической типизацией типы в любом случае должны быть скомпилированы в целевой объект, и поэтому они известны, а в языках с динамической типизацией часто int, float и строки могут использоваться взаимозаменяемо; обратите также внимание на то, что система типов XmlRpc, как правило, не соответствует системе типов целевого языка, который может иметь несколько целочисленных типов, и т. д.}

  6. Библиотеки XmlRpc обычно напрямую интегрируются с библиотекой Http, тогда как все библиотеки сериализации Xml (?) требуют, чтобы программист приложения передал текст XML в вызов Http. В более современных языках, таких как Java/Python/C#, это тривиальный вопрос, но не так, например. С++.

  7. Существует «маркетинговое мнение», что XML описывает «документы», тогда как XmlRpc предназначен для вызовов процедур. Считается, что отправка сообщения XmlRpc содержит обязательство сервера выполнить какое-то действие, в то время как это восприятие не так сильно с обычным XML.

Некоторые люди скажут "какая разница - синтаксический анализ XML-данных с использованием рекурсивного спуска/DOM/SAX в любом случае довольно прост", и в этом случае большинство приведенных выше возражений неуместны.

Для тех, кто по-прежнему предпочитает простоту использования автоматического создания объектов на родном языке, многие основные языки имеют библиотеки, которые автоматически сериализуют объекты языкового уровня в XML, не прибегая к XmlRpc, например:

.NETJavaПитон

Возможно, успех XmlRpc в его нынешнем виде связан с доступностью библиотек, которые автоматически создают объекты языкового уровня, и, в свою очередь, эти библиотеки имеют преимущество перед своими обычными XML-аналогами из-за перечисленных выше проблем.

Недостатки XmlRpc:

  • Как упоминалось в вопросе, он ужасно толстый

  • Поддержка простого XML повсеместна и обычно не требует интеграции с крупными сторонними библиотеками. Во многих приложениях в любом случае требуется преобразование автоматически созданных объектов в собственные объекты приложения.

  • Многие реализации XmlRpc не могут создавать истинные объекты языкового уровня, ожидаемые программистами, и вместо этого требуют, например, поиск полей во время выполнения или дополнительный синтаксис.

  • Если документ определения схемы используется для проверки вызовов RPC, например файл DTD, вы теряете возможность проверить схему уровня приложения — файл DTD просто сообщит вам, что «это допустимый XmlRpc». Насколько мне известно, не существует стандартного способа определения схемы уровня приложения с помощью протокола на основе XmlRpc.

person Tim Cooper    schedule 14.11.2009

Главное преимущество в том, что кто-то уже разработал для вас схему вызова. Это особенно полезно в языках с отражением, где вы можете просто вслепую передать, скажем, сложную структуру вызову RPC, и он решит, как перевести ее в XML для вас. Это менее ценно, скажем, в C++, где вам нужно явно указать библиотеке XML-RPC все типы данных.

Вы правы, это не захватило мир штурмом. Странности, которые вы находите в библиотеках, связаны с этим низким уровнем интереса. Я использовал два сам, и нашел ошибки в обоих. И оба были заброшенными, так что мне некуда было отправлять исправления, поэтому у меня есть частные версии с исправлениями для обоих. Вздох.

person Warren Young    schedule 04.09.2009
comment
Уоррен, если можно использовать отражение для сериализации структур данных в XmlRpc, разве нельзя также использовать отражение для сериализации структур данных в простой XML? - person Tim Cooper; 04.09.2009
comment
Конечно, но вы должны сами написать весь этот код сериализации, а теперь вы изобрели еще одну проприетарную XML-схему. Есть что сказать о простоте и совместимости. - person Warren Young; 04.09.2009
comment
Еще одна проприетарная схема, подразумевающая, что существует более одного способа кодирования объектов в XML. В приведенном выше примере, если мы просто запретим атрибуты, то наверняка существует только один способ закодировать объект? Это не изобретение какой-либо частной схемы. На самом деле уже существуют библиотеки для сериализации объектов в простой XML для C# и PHP и, вероятно, для большинства языков. - person Tim Cooper; 08.09.2009
comment
Существует бесконечное количество несовместимых способов кодирования любой части данных в виде XML. Вы можете возразить, что одна кодировка лучше для одной цели, другая кодировка — для другой, но если для каждой цели используется своя кодировка, не будет совместимости и повторного использования кода. Я не пытаюсь сказать вам, что вы должны использовать XML-RPC. Я просто предлагаю вам не отказываться от него только потому, что вам больше нравится конкретное колесо. Учитывайте потребности тех, кому приходится писать программы, считывающие те же самые структуры данных. - person Warren Young; 08.09.2009
comment
бесконечные несовместимые способы кодирования? Можете ли вы предложить хотя бы один альтернативный способ кодирования вышеуказанного объекта в простой XML, если мы применим правило, что атрибуты не разрешены? XmlRpc не устраняет необходимость определения схемы уровня приложения, например. как писать имена полей. У каждого языка есть библиотека для сериализации объектов в простой XML, они, кажется, не думают, что есть какой-то выбор в том, как кодировать объекты. - person Tim Cooper; 09.09.2009
comment
Шестнадцатеричный дамп упакованной двоичной структуры ваших данных выше, с целыми числами в сетевом порядке байтов: ‹room›000000014d522d313031004d61746820526f6f6d000000001e‹/room›. Бонусная альтернатива: то же самое, но с байтами в блоке CDATA. Вы можете подумать, что это глупый пример, но когда-то мы передавали структуры вот так. Вы могли бы сделать это таким образом, если бы вам сказали перенести старый протокол на XML, но у вас не было бюджета на обновление старых программ, поэтому вы просто заключаете данные в теги XML. Нет, если это отменяет мое обоснование XML-RPC: совместимость и простота реализации. - person Warren Young; 09.09.2009

Легко: XML RPC обеспечивает

  • стандартный способ передать имя метода
  • система набора текста. Я довольно часто работаю с телефонными номерами, это строки, а НЕ числа.
  • стандартный способ возврата ошибок
  • самоанализ (почти) бесплатно

Все это поверх стандартного XML.

person Mauvaisours    schedule 19.10.2010

Основная ценность XmlRpc заключается в том, что вам не нужно писать код для создания и анализа XML-документов, передаваемых по протоколу HTTP, поскольку XML-RPC — это предопределенная схема XML для представления вызовов функций.

Даже с менее чем оптимальными библиотеками существует дополнительное производное значение, поскольку использование этого типа системы позволяет вам определять ваши удаленные интерфейсы как базовые языковые интерфейсы (абстрактный класс C++, интерфейсы Java и т. д.), которые не зависят от используемого проводного протокола. для связи между компонентами.

Отделение определений интерфейса от проводного протокола (XML-RPC, SOAP и т. д.) позволяет в конечном итоге заменить их альтернативными протоколами, где это необходимо. Например, в нашей системе есть службы, которые доступны с использованием Hessian для интерфейсов Flex и SOAP. для наших интерфейсов .NET (библиотека Hessian .Net имеет запрещенную лицензию).

Придерживаясь XML-RPC сейчас, у вас есть возможность переключиться на какой-либо другой протокол в будущем с минимальным объемом рефакторинга.

person John Stauffer    schedule 04.09.2009
comment
При использовании простого XML нет необходимости писать код для создания и анализа XML-документов. Я легко нашел ссылки на библиотеки, которые уже делают это для C# и PHP точно так же, как библиотеки делают это для XmlRpc. Если бы у меня был код, работающий с XML, меня бы не интересовал API с несколькими проводными протоколами. - person Tim Cooper; 08.09.2009

Начну с конца и вернусь назад:

3) Да, вы можете выполнять удаленные вызовы процедур с помощью простого XML (или простых строк или двоичного протокола). Разница в том, что XmlRpc — это четко определенный протокол со многими доступными реализациями, что означает: а) вам не нужно писать столько кода и б) вы можете взаимодействовать с кем бы то ни было на другом конце провода без вам или им приходится иметь дело с кодом друг друга. XmlRpc служит мостом.

2) Я бы сказал, что это довольно распространено :-) Я работал с XmlRpc в Java, поэтому не могу комментировать проблемы с реализацией C++/PHP.

1) из-за (3) выше. Многословность протокола является как следствием, так и причиной его интероперабельности.

person ChssPly76    schedule 04.09.2009
comment
3) Если бы я должен был выполнять удаленные вызовы процедур с помощью простых строк или двоичных файлов, это было бы ужасно и потребовало бы разработки форматов для каждого взаимодействия. Но простой XML дает четко определенный формат для передачи структурированных значений. Я не думаю, что вы ответили на вопрос, что XmlRpc имеет над XML? 1) Мои примеры сравнивают XmlRpc с XML и доказывают, что вам не нужно быть многословным, чтобы обеспечить взаимодействие. XML считается протоколом, обеспечивающим совместимость. - person Tim Cooper; 04.09.2009
comment
Ты не прав. Взяв ваш пример, <room ROOM_ID=1 CODE=MR-101 NAME=”Math Room” CAPACITY=30 /> откуда мне знать, как преобразовать это в объект, если я получу это по проводу? Это ничем не отличается от получения, скажем, room|1|MR-101|Math Room|30 и использования порядка полей. Дело в том, что XML-RPC предоставляет хорошо определенный протокол связи, а XML сам по себе - нет. - person ChssPly76; 04.09.2009
comment
Я не понимаю смысла полагаться на полевой порядок. В этом случае атрибуты (или теги) имеют имена. Почему бы вам не посмотреть на имена полей, а не на порядок полей? - person Tim Cooper; 04.09.2009
comment
И ваш однострочный XML, и моя строка, разделенная вертикальной чертой, могут успешно использоваться для связи между двумя сторонами. В обоих случаях принимающая сторона должна УЖЕ знать структуру объекта (например, в вашем XML отсутствуют типы данных, не говоря уже о его неспособности передать что-либо, кроме простой структуры в ее нынешнем виде); и если я знаю, что я демаршалирую, мне действительно не нужны имена полей. Дело в том, что ваши примеры XML не подходят для реального общения, тогда как XML-RPC. - person ChssPly76; 04.09.2009
comment
XML может представлять произвольно сложные деревья - я не понял вашей точки зрения на неспособность передать что-либо, кроме простой структуры. Типы данных, кажется, единственное, что добавляет XmlRpc... (хотя в любом случае между разными языками часто возникает несоответствие между системами типов.) В любом протоколе на основе XmlRpc должно быть некоторое общее понимание структуры объекта, например. каких имен полей ожидать, но XML и XmlRpc позволяют добавлять поля и изменять их порядок, не влияя на семантику. XML должен быть адекватным для реального общения, потому что он используется довольно широко. - person Tim Cooper; 04.09.2009
comment
Что касается вашей вездесущей ссылки, это хороший пример угасания интереса к XML-RPC или, по крайней мере, его отсутствия. По крайней мере, одна из ссылок на этой странице указывает на сайт сквоттера домена, хотя я отправил специалисту по обслуживанию сайта обновление 5 недель назад. Самое последнее сообщение в списке рассылки еще старше, и на этом сайте есть несколько других неработающих ссылок, некоторые из которых являются ссылками верхнего уровня. Да, я связываю угасание интереса Дэйва Винера с интересом сообщества. Сообществам нужны лидеры, а слабое лидерство означает слабые сообщества. Возможно, JSON заменит XML-RPC... - person Warren Young; 04.09.2009
comment
@ Тим - я не знаю, как объяснить это яснее. Вот что может помочь: напишите схему (или DTD) для XML-файла ROOM; убедитесь, что это подтверждает. Бросьте произвольно сложное дерево, пока вы на нем; не забывайте о вызовах методов/результатах/сопоставлении исключений (в конце концов, это RPC). Теперь сделайте то же самое для сущности «CAR» («STOCK_TRADE», «MEDICAL_RECORD», что угодно) — имейте в виду, что все ваши новые сопоставления XML должны соответствовать той же схеме/DTD, которую вы создали. Теперь сравните эту схему со спецификацией XML-RPC. - person ChssPly76; 04.09.2009
comment
Я согласен с Уорреном. Я проверил 10 ссылок, некоторые из них мертвы, остальные датированы 2002-2004 годами. - person analytik; 18.08.2010