XML-RPC — это протокол удаленного вызова процедур (RPC) , который использует XML для кодирования своих вызовов и HTTP в качестве транспортного механизма. [1]
Протокол XML-RPC был создан в 1998 году Дэйвом Винером из UserLand Software и Microsoft , [2] причем Microsoft рассматривала протокол как неотъемлемую часть масштабирования своих усилий в области электронной коммерции между предприятиями. [3] По мере внедрения новых функций стандарт эволюционировал в то, что сейчас называется SOAP . [4]
UserLand поддерживал XML-RPC, начиная с версии 5.1 своей системы управления веб-контентом Frontier [4] , выпущенной в июне 1998 года. [5]
Идея XML-RPC о человекочитаемом и записываемом стандарте, пригодном для анализа скриптами для HTTP-запросов и ответов, также была реализована в конкурирующих спецификациях, таких как Web Distributed Data Exchange (WDDX) компании Allaire и Web Interface Definition Language (WIDL) компании webMethod. [6] Предшествующий уровень техники: обёртывание объектов COM , CORBA и Java RMI в синтаксис XML и их передача через HTTP также существовали в технологии WebBroker компании DataChannel. [7] [8]
Универсальное использование XML для удаленного вызова процедур (RPC) было запатентовано Филиппом Мерриком, Стюартом Алленом и Джозефом Лаппом в апреле 2006 года, заявив о преимуществах предварительной заявки, поданной в марте 1998 года. Патент был назначен webMethods , расположенному в Фэрфаксе, штат Вирджиния . Срок действия патента истек 23 марта 2019 года. [9]
В XML-RPC клиент выполняет RPC, отправляя HTTP-запрос на сервер, реализующий XML-RPC, и получает HTTP-ответ. Вызов может иметь несколько параметров и один результат. Протокол определяет несколько типов данных для параметров и результата. Некоторые из этих типов данных являются сложными, т. е. вложенными. Например, у вас может быть параметр, представляющий собой массив из пяти целых чисел.
Структура параметров/результатов и набор типов данных должны соответствовать используемым в распространенных языках программирования.
Идентификация клиентов для целей авторизации может быть достигнута с помощью популярных методов безопасности HTTP. Базовая аутентификация доступа может использоваться для идентификации и аутентификации.
По сравнению с протоколами RESTful, где передаются представления ресурсов (документы), XML-RPC предназначен для вызова методов . Практическое отличие заключается лишь в том, что XML-RPC гораздо более структурирован, что означает, что общий библиотечный код может использоваться для реализации клиентов и серверов, и требуется меньше работы по проектированию и документированию для конкретного прикладного протокола. [ необходима цитата ] Одно из существенных технических различий между типичными протоколами RESTful и XML-RPC заключается в том, что многие протоколы RESTful используют HTTP URI для информации о параметрах, тогда как в XML-RPC URI просто идентифицирует сервер.
JSON-RPC похож на XML-RPC.
Распространенные типы данных преобразуются в их эквиваленты XML с примерами значений, показанными ниже:
Пример типичного запроса XML-RPC:
<?xml version="1.0"?> <methodCall> <methodName> examples.getStateName </methodName> <params> <param> <value><i4> 40 </i4></value> </param> </params> </methodCall>
Пример типичного ответа XML-RPC:
<?xml version="1.0"?> <methodResponse> <params> <param> <value><string> Южная Дакота </string></value> </param> </params> </methodResponse>
Типичная ошибка XML-RPC:
<?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name> faultCode </name> <value><int> 4 </int></value> </member> <member> <name> faultString </name> <value><string> Слишком много параметров. </string></value> </member> </struct> </value> </fault> </methodResponse>
Недавние критики (с 2010 года и далее) XML-RPC утверждают, что вызовы RPC можно делать с помощью простого XML, и что XML-RPC не добавляет никакой ценности по сравнению с XML. Как XML-RPC, так и XML требуют модели данных на уровне приложения, например, какие имена полей определены в схеме XML или имена параметров в XML-RPC. Кроме того, XML-RPC использует примерно в 4 раза больше байтов по сравнению с простым XML для кодирования тех же объектов, что само по себе многословно по сравнению с JSON . [10] [11] [12]