Открыть сервис

XML-RPC

XML-RPC — это протокол удалённого вызова процедур (RPC), использующий формат XML для кодирования данных и протокол HTTP в качестве транспортного механизма. Он был разработан в 1998 году компанией Microsoft под руководством Дэйва Винера и представляет собой прародителя более современных веб-сервисов, таких как SOAP и, в определённой степени, RESTful API. XML-RPC предназначен для обеспечения стандартизированного способа обмена данными и вызова функций между различными компьютерными системами, работающими в разнородных программных и аппаратных средах.

История создания

XML-RPC был создан как промежуточное звено между ранними протоколами RPC, такими как Sun RPC (ONC RPC), и более сложными веб-сервисами. В то время asynchron (асинхронный) обмен данными между приложениями в интернете был сложен из-за отсутствия единого стандарта для коммуникации через HTTP. В 1998 году группа разработчиков во главе с Дэйвом Винером из UserLand Software и Бобом Аткинсоном из Microsoft опубликовала спецификацию протокола. Основной идеей было сделать протокол настолько простым, насколько возможно, используя всего два готовых и широко распространённых стандарта: XML для представления данных и HTTP для их передачи. Изначально XML-RPC был реализован в среде Frontier (UserLand), а затем и в Windows NT. В 1999 году на его основе был разработан протокол SOAP (Simple Object Access Protocol), который впоследствии стал более сложным и функциональным, но и более громоздким. Несмотря на появление SOAP, XML-RPC остаётся в использовании благодаря своей простоте и лёгкости реализации.

Архитектура и принцип работы

XML-RPC основан на модели «клиент-сервер». Клиент формирует запрос, сериализованный в XML, и отправляет его на сервер по протоколу HTTP. Сервер принимает запрос, десериализует его, выполняет запрошенную процедуру и возвращает результат также в виде XML-документа по протоколу HTTP.

Формат запроса

Типичный XML-RPC запрос представляет собой XML-документ, корневой элемент которого — <methodCall>. Внутри него содержатся два обязательных дочерних элемента:

Пример запроса на получение информации о книге по её идентификатору:

``xml <?xml version="1.0"?> <methodCall> <methodName>books.getBookInfo</methodName> <params> <param> <value><int>12345</int></value> </param> </params> </methodCall> ``

Формат ответа

Успешный ответ сервера упаковывается в XML-документ с корневым элементом <methodResponse>. Внутри него находится <params>, который содержит <param> с элементом <value> — результатом выполнения процедуры.

``xml <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>Война и мир</string></value> </param> </params> </methodResponse> ``

Обработка ошибок

В случае возникновения ошибки сервер возвращает не <params>, а элемент <fault>. Внутри <fault> находится <value> типа <struct> с двумя элементами: faultCode (целое число — код ошибки) и faultString (строка — текстовое описание ошибки).

``xml <?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name>faultCode</name> <value><int>4</int></value> </member> <member> <name>faultString</name> <value><string>Book not found</string></value> </member> </struct> </value> </fault> </methodResponse> ``

Типы данных

XML-RPC поддерживает ограниченный набор типов данных, что отличает его от более гибких протоколов. Основные типы:

Тип данных в XMLТип в ЯП (пример Python)Описание
<i4> / <int>int32-битное целое число (знаковое)
<boolean>boolЛогическое значение (0 — false, 1 — true)
<string>strСтрока текста
<double>floatЧисло с плавающей запятой двойной точности
<dateTime.iso8601>datetimeДата и время (в формате ISO 8601: 19980717T14:08:55)
<base64>bytesДанные, закодированные в Base64 (для передачи бинарных данных)
<array>listМассив (список) значений. Не требует указания типа элементов
<struct>dictАссоциативный массив (словарь), состоящий из элементов <member> с ключом <name> и значением <value>

Отсутствие поддержки null или nil было существенным ограничением протокола. В более новых реализациях (например, в расширении xmlrpc в Python) добавлена поддержка <nil/> как расширение базового протокола.

Применение

XML-RPC нашёл применение в ряде областей, хотя с развитием REST API его популярность снизилась.

Системы управления контентом (CMS)

Одной из важных сфер применения стала интеграция различных CMS и инструментов редактирования контента. В 1999 году компания UserLand совместно с другими участниками разработала спецификацию WordPress API (XML-RPC). Протокол используется в блоговых платформах (WordPress, Drupal, MetaWeblog API) для выполнения таких операций, как:

Благодаря этому сторонние приложения (например, офлайн-клиенты или мобильные приложения) могут удалённо управлять сайтом без необходимости написания специальных HTTP-обработчиков под каждую платформу.

Интеграция и автоматизация

XML-RPC используется в некоторых системах автоматизации и обмена данными между корпоративными приложениями. Например, в некоторых решениях для телефонии (например, Asterisk) для управления конфигурацией и вызовами. Он также применяется в ряде серверных библиотек (например, в стандартной библиотеке языка Python — модуль xmlrpc.server) для быстрого создания примитивных веб-сервисов.

Редакторские инструменты

Протокол MetaWeblog API, расширяющий XML-RPC, долгое время был стандартом для взаимодействия большинства офлайн-редакторов (например, Windows Live Writer, MarsEdit) с блогами. Сейчас этот подход постепенно вытесняется REST API, но остаётся обратно совместимым во многих системах.

Преимущества и недостатки

Преимущества

  1. Простота: Спецификация протокола занимает всего несколько страниц. Легко реализовать на любом языке программирования.
  2. Стандартизация: Использует только XML и HTTP — два универсальных и широко поддерживаемых стандарта.
  3. Независимость от языка: Клиент и сервер могут быть написаны на совершенно разных языках программирования.
  4. Человекочитаемость: XML-документы легко читаются и отлаживаются.
  5. Низкий порог входа: Для начала работы не требуется сложных инструментов или библиотек — достаточно простого HTTP-клиента и XML-парсера.

Недостатки

  1. Избыточность: XML-формат создаёт значительный объём данных по сравнению с бинарными протоколами (например, Protocol Buffers) или более компактными текстовыми форматами (JSON).
  2. Производительность: Парсинг XML существенно медленнее, чем парсинг JSON или бинарных данных.
  3. Ограниченные типы данных: Поддержка только базовых типов затрудняет передачу сложных структур данных, например, null-значений или вложенных коллекций без потери информации.
  4. Отсутствие стандарта безопасности: Протокол не определяет собственных механизмов аутентификации и шифрования, полагаясь на HTTPS. При передаче открытого текста через HTTP все данные передаются в незашифрованном виде.
  5. Уязвимости: Парсинг XML без учёта безопасности может привести к XXE-атакам (XML External Entity) — атакам на внешние сущности XML. Для безопасной работы необходима обязательная настройка парсера на игнорирование внешних сущностей.
  6. Ограниченная поддержка современных веб-стандартов: Не поддерживает кэширование, гибкую маршрутизацию, версионирование API так, как это делают современные RESTful сервисы.

Сравнение с альтернативными протоколами

XML-RPC vs SOAP

SOAP (в версиях 1.1 и 1.2) является наследником XML-RPC и использует сходную идеологию (XML + HTTP), но отличается значительно большей сложностью. SOAP поддерживает строгую типизацию (через WSDL), расширенный набор типов, механизмы безопасности (WS-Security), транзакции и другие корпоративные возможности. XML-RPC же остаётся простым и лёгким в реализации, за что и ценится в простых сценариях.

XML-RPC vs REST

REST (Representational State Transfer) — архитектурный стиль, а не протокол. REST-сервисы обычно передают данные в формате JSON, что делает их компактнее и быстрее XML. REST также опирается на стандартные HTTP-методы (GET, POST, PUT, DELETE), в то время как XML-RPC использует только POST. REST более гибок в проектировании API для сложных систем, но требует большего проектирования и стандартизации. Для простых задач XML-RPC может быть быстрее в реализации.

XML-RPC vs JSON-RPC

JSON-RPC — более современный потомок идеи RPC, использующий JSON вместо XML. Он обеспечивает меньший размер сообщений, более быстрый парсинг и лучшую читаемость. JSON-RPC также поддерживает уведомления (нотификации) и пакетные вызовы. Сейчас он практически повсеместно вытесняет XML-RPC в веб-разработке, особенно при использовании JavaScript.

Современное состояние и перспективы

На 2024 год XML-RPC утратил доминирующее положение в веб-разработке. Большинство современных API проектируются как RESTful с JSON или используют GraphQL. Однако протокол продолжает существовать в нескольких нишах:

В целом, XML-RPC сохраняет своё значение как важный исторический этап в развитии веб-сервисов. Его простота делает его полезным инструментом для узкого круга задач, но он не рекомендуется для новых проектов из-за технических ограничений (избыточность, безопасность) и наличия более современных альтернатив, таких как JSON-RPC или REST.

Интересные факты

Источники

  1. Информация о протоколе XML-RPC, официальная спецификация (UserLand Software, 1998).
  2. Документация к модулям xmlrpc в стандартной библиотеке Python.
  3. Материалы по истории веб-сервисов: статьи Дэйва Винера, Боба Аткинсона, обсуждения в архивах W3C.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →