XML-RPC: удаленные вызовы процедур в формате XML

Вызов функций через удаленный доступ на удаленных компьютерах в сети или в распределенных системах (т.е. совокупности независимых компьютеров) является обычной практикой на протяжении десятилетий. Основная идея фундаментальной технологии RPC (удаленные вызовы процедур) была заложена еще в 1976 году Джеймсом Э. Уайтом в RFC 707, что делает этот принцип более древним, чем Всемирная паутина.

Факт

В 2015 году компания Google разработала фреймворк gRPC, чтобы RPC соответствовал требованиям современных структур компьютерных систем.

XML-RPC — одно из самых популярных решений, позволяющее пользователям использовать удобные RPC-запросы для собственных нужд. Это решение выполняет вызовы с использованием протокола HTTP(S) и расширяемого языка разметки (XML). Итак, что именно представляет собой эта спецификация, когда она используется и как она работает?

Что такое XML-RPC?

XML-RPC (сокращение от Extensible Markup Language remote procedure call) — это спецификация протокола для выполнения вызовов RPC (удаленных вызовов в компьютерных сетях) с использованием сетевого протокола HTTP без статических данных и языка разметки XML, который и дал ему часть названия. В то время как HTTP управляет передачей данных, XML используется для отображения этих данных. При определении стандарта XML-RPC большое внимание уделялось простоте реализации на различных языках программирования и системных платформах.

Примечание .

Спецификация XML-RPC поддерживает только незащищенный протокол HTTP для передачи данных. Но существуют широко используемые и принятые версии стандарта, которые поддерживают более безопасный протокол HTTPS, который также использует шифрование SSL/TLS.

XML-RPC был разработан в 1998 году в результате тесного сотрудничества между Microsoft и Дэйвом Винером, ведущим разработчиком программного обеспечения и основателем компании UserLand Software. Microsoft увидела в новом стандарте большой потенциал для развития собственных отношений B2B. Постоянно добавляя новые функции, XML-RPC зарекомендовал себя как интерфейсный протокол для веб-служб. Усовершенствованная форма XML-RPC стала известна как SOAP (Simple Object Access Protocol).

Как работает XML-RPC?

Клиенты, которые хотят использовать XML-RPC, используют протокол передачи данных HTTP — точнее, метод запроса HTTP POST. После получения HTTP-запроса сервер анализирует XML-документ, содержащийся в теле запроса. Затем он генерирует из его содержимого параметры для нужной функции и выполняет их. Сервер упаковывает результат обратно в XML-документ, который передается обратно клиенту в HTTP-ответе. XML-RPC поддерживает следующие типы данных для передачи параметров или в ответе, который получает клиент:

Тип данных Пример тега Описание
массив <array><data>…</data></array> Список, который может содержать несколько значений или типов данных
base64 <base64>SGFsbG8gV2VsdA==</base64> Двоичные данные в кодировке Base64
булево <boolean>1</boolean> Булева переменная (true = 1 против false = 0)
dateTime.iso8601 <dateTime.iso8601>20200414T16:23:55</dateTime.iso8601> Дата и время в формате ISO 8601
двойной <double>-0.32653</double> Число двойной точности с плавающей точкой (64-битное)
целое число <int>32</int> или <i4>32</i4> Целое число (целое число)
строка <string>Hello world!</string> Строка символов; может содержать ноль байт
struct <struct><data>…</data></struct> Набор пар ключ-значение (ключами в данном случае являются символьные строки, а значения могут быть любого типа).

Если вам необходимо объединить несколько значений или типов данных, синтаксис XML-RPC предлагает два варианта: «массив» и «структура». Первый вариант позволяет перечислить нужные данные последовательно в любом порядке. Опция «struct» используется для передачи на сервер заранее определенных пар ключ-значение, как показано в примере ниже:

<struct>
  <member>
    <name>entry 1</name>
    <value><int>1</int></value>
  </member>
  <member>
    <name>entry 2</name>
    <value><int>2</int></value>
  </member>
</struct>
Примечание

Некоторые языки программирования, такие как Java, которые имеют реализацию XML-RPC, также позволяют вводить нулевые значения. Для этого в XML-документах необходимо всегда использовать тип данных «nil». Однако этот тип данных официально не является частью спецификации XML-RPC и поддерживается не всеми серверами.

Когда используется XML-RPC?

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

Тем не менее, и сегодня существуют веб-приложения, использующие интерфейс XML-RPC (например, для обеспечения простой передачи данных между внешними службами). Например, Федеральное центральное налоговое управление Германии (Bundeszentralamt für Steuern) предоставляет интерфейс XML-RPC для выполнения автоматических проверок иностранных идентификаторов НДС (с 2019 года через запросы HTTPS). Системы управления контентом, такие как WordPress, часто используют интерфейс XML-RPC для обмена данными с другими веб-сервисами. Кроме того, формат передачи данных лежит в основе техники pingback, которая на протяжении многих лет является важным инструментом построения ссылок для блоггеров. Подробнее об этом вы можете узнать, прочитав статью «Что такое pingbacks и trackbacks?».

Пример простого запроса к серверу через XML-RPC

Наконец, давайте рассмотрим простой пример, иллюстрирующий взаимодействие клиента и сервера через интерфейс XML-RPC. HTTP-запрос клиента выглядит следующим образом:

<?xml version="1.0"?>
  <methodCall>
    <methodName>statustest</methodName>
    <params>
    <param>
      <value><i4>10</i4></value>
    </param>
    </params>
  </methodCall>

В этом примере функция «statustest» вызывается в контейнере «methodCall», который, в свою очередь, определен в контейнере «methodName». В качестве параметра функция предоставляет целочисленное значение «10».

Ниже приведен возможный ответ сервера на этот «statustest»:

<?xml version="1.0"?>
  <methodResponse>
    <params>
    <param>
      <value><string>Status: OK</string></value>
    </param>
    </params>
  </methodResponse>

Простой ответ сервера в этом примере — «Status: OK».

Оцените статью
cdelat.ru
Добавить комментарий