
Вызов функций через удаленный доступ на удаленных компьютерах в сети или в распределенных системах (т.е. совокупности независимых компьютеров) является обычной практикой на протяжении десятилетий. Основная идея фундаментальной технологии 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».