XML-RPC — Введение
RPC обозначает Удаленный вызов процедур. Как видно из его названия, это механизм для вызова процедуры или функции, доступной на удаленном компьютере. RPC — намного более старая технология, чем Интернет. По сути, RPC предоставляет разработчикам механизм определения интерфейсов, которые можно вызывать по сети. Эти интерфейсы могут быть простыми, как один вызов функции, или сложными, как большой API.
Что такое XML-RPC?
XML-RPC — один из самых простых и надежных подходов к веб-сервисам, который позволяет компьютерам легко вызывать процедуры на других компьютерах.
-
XML-RPC позволяет программам выполнять вызовы функций или процедур по сети.
-
XML-RPC использует протокол HTTP для передачи информации с клиентского компьютера на серверный компьютер.
-
XML-RPC использует небольшой словарь XML для описания характера запросов и ответов.
-
Клиент XML-RPC указывает имя процедуры и параметры в запросе XML, а сервер возвращает либо ошибку, либо ответ в ответе XML.
-
Параметры XML-RPC представляют собой простой список типов и содержимого. Структуры и массивы являются наиболее сложными доступными типами.
-
XML-RPC не имеет понятия об объектах и не имеет механизма для включения информации, которая использует другой словарь XML.
-
Однако с помощью XML-RPC и веб-сервисов Интернет становится набором процедурных соединений, в которых компьютеры обмениваются информацией по тесно связанным путям.
-
XML-RPC появился в начале 1998 года; оно было опубликовано UserLand Software и первоначально внедрено в их продукт Frontier.
XML-RPC позволяет программам выполнять вызовы функций или процедур по сети.
XML-RPC использует протокол HTTP для передачи информации с клиентского компьютера на серверный компьютер.
XML-RPC использует небольшой словарь XML для описания характера запросов и ответов.
Клиент XML-RPC указывает имя процедуры и параметры в запросе XML, а сервер возвращает либо ошибку, либо ответ в ответе XML.
Параметры XML-RPC представляют собой простой список типов и содержимого. Структуры и массивы являются наиболее сложными доступными типами.
XML-RPC не имеет понятия об объектах и не имеет механизма для включения информации, которая использует другой словарь XML.
Однако с помощью XML-RPC и веб-сервисов Интернет становится набором процедурных соединений, в которых компьютеры обмениваются информацией по тесно связанным путям.
XML-RPC появился в начале 1998 года; оно было опубликовано UserLand Software и первоначально внедрено в их продукт Frontier.
Почему XML-RPC?
Если вам нужно интегрировать несколько вычислительных сред, но вам не нужно обмениваться сложными структурами данных напрямую, вы обнаружите, что XML-RPC позволяет быстро и легко устанавливать связь.
Даже если вы работаете в одной среде, вы можете обнаружить, что подход RPC упрощает подключение программ, которые имеют разные модели данных или ожидания обработки, и что он может обеспечить легкий доступ к повторно используемой логике.
-
XML-RPC является отличным инструментом для установления различных соединений между компьютерами.
-
XML-RPC предлагает интеграторам возможность использовать стандартный словарь и подход для обмена информацией.
-
Наиболее очевидная область применения XML-RPC — это подключение различных сред, позволяющих Java общаться с Perl, Python, ASP и так далее.
XML-RPC является отличным инструментом для установления различных соединений между компьютерами.
XML-RPC предлагает интеграторам возможность использовать стандартный словарь и подход для обмена информацией.
Наиболее очевидная область применения XML-RPC — это подключение различных сред, позволяющих Java общаться с Perl, Python, ASP и так далее.
Технический обзор XML-RPC
XML-RPC состоит из трех относительно небольших частей:
-
Модель данных XML-RPC : набор типов для использования при передаче параметров, возвращаемых значений и ошибок (сообщений об ошибках).
-
Структуры запросов XML-RPC : HTTP-запрос POST, содержащий информацию о методах и параметрах.
-
Структуры ответов XML-RPC : HTTP-ответ, содержащий возвращаемые значения или информацию об ошибках.
Модель данных XML-RPC : набор типов для использования при передаче параметров, возвращаемых значений и ошибок (сообщений об ошибках).
Структуры запросов XML-RPC : HTTP-запрос POST, содержащий информацию о методах и параметрах.
Структуры ответов XML-RPC : HTTP-ответ, содержащий возвращаемые значения или информацию об ошибках.
Мы будем изучать все эти три компонента в следующих трех главах.
XML-RPC — модель данных
Спецификация XML-RPC определяет шесть основных типов данных и два составных типа данных, которые представляют комбинации типов.
Основные типы данных в XML-RPC
Тип | Значение | Примеры |
---|---|---|
int или i4 | 32-разрядные целые числа от — 2 147 483 648 до 2 147 483 647. |
<Int> 27 </ Int> <I4> 27 </ i4> |
двойной | 64-битные числа с плавающей точкой |
<Двойной> 27,31415 </ двойной> <Двойной> -1,1465 </ двойной> |
логический | true (1) или false (0) |
<Логическое значение> 1 </ булево> <Логическое> 0 </ булево> |
строка | Текст ASCII, хотя многие реализации поддерживают Unicode |
<Строка> Hello </ строка> <Строка> помешанные! @ </ Строка> |
dateTime.iso8601 | Даты в формате ISO8601: CCYYMMDDTHH: MM: SS |
<DateTime.iso8601> 20021125T02: 20: 04 </DateTime.iso8601> <DateTime.iso8601> 20020104T17: 27: 30 </DateTime.iso8601> |
base64 | Двоичная информация, закодированная как Base 64, как определено в RFC 2045 |
<Base64> SGVsbG8sIFdvcmxkIQ == </ base64> |
<Int> 27 </ Int>
<I4> 27 </ i4>
<Двойной> 27,31415 </ двойной>
<Двойной> -1,1465 </ двойной>
<Логическое значение> 1 </ булево>
<Логическое> 0 </ булево>
<Строка> Hello </ строка>
<Строка> помешанные! @ </ Строка>
<DateTime.iso8601>
20021125T02: 20: 04
</DateTime.iso8601>
<DateTime.iso8601>
20020104T17: 27: 30
</DateTime.iso8601>
<Base64> SGVsbG8sIFdvcmxkIQ == </ base64>
Эти базовые типы всегда заключены в элементы значения . Строки (и только строки) могут быть заключены в элемент значения, но пропустить элемент строки . Эти основные типы могут быть объединены в два более сложных типа, массивы и структуры. Массивы представляют последовательную информацию, в то время как структуры представляют пары имя-значение, во многом как хеш-таблицы, ассоциативные массивы или свойства.
Массивы обозначаются элементом массива , который содержит элемент данных, содержащий список значений. Как и другие типы данных, элемент массива должен быть заключен в элемент значения . Например, следующий массив содержит четыре строки:
<value> <array> <data> <value><string>This </string></value> <value><string>is </string></value> <value><string>an </string></value> <value><string>array.</string></value> </data> </array> </value>
Следующий массив содержит четыре целых числа:
<value> <array> <data> <value><int>7</int></value> <value><int>1247</int></value> <value><int>-91</int></value> <value><int>42</int></value> </data> </array> </value>
Массивы также могут содержать смеси разных типов, как показано здесь:
<value> <array> <data> <value><boolean>1</boolean></value> <value><string>Chaotic collection, eh?</string></value> <value><int>-91</int></value> <value><double>42.14159265</double></value> </data> </array> </value>
Создание многомерных массивов просто — просто добавьте массив внутри массива:
<value> <array> <data> <value> <array> <data> <value><int>10</int></value> <value><int>20</int></value> <value><int>30</int></value> </data> </array> </value> <value> <array> <data> <value><int>15</int></value> <value><int>25</int></value> <value><int>35</int></value> </data> </array> </value> </data> </array> </value>
Простая структура может выглядеть так:
<value> <struct> <member> <name>givenName</name> <value><string>Joseph</string></value> </member> <member> <name>familyName</name> <value><string>DiNardo</string></value> </member> <member> <name>age</name> <value><int>27</int></value> </member> </struct> </value>
Таким образом, вы можете реализовать практически все типы данных, поддерживаемые любым языком программирования.
XML-RPC — формат запроса
Запросы XML-RPC представляют собой комбинацию содержимого XML и заголовков HTTP. Содержимое XML использует структуру типизации данных для передачи параметров и содержит дополнительную информацию, определяющую, какая процедура вызывается, а заголовки HTTP предоставляют оболочку для передачи запроса через Интернет.
Каждый запрос содержит один XML-документ, корневым элементом которого является элемент methodCall . Каждый элемент methodCall содержит элемент methodName и элемент params . Элемент methodName идентифицирует имя вызываемой процедуры, а элемент params содержит список параметров и их значений. Каждый элемент params включает в себя список элементов param, которые в свою очередь содержат элементы значения .
Например, чтобы передать запрос методу circleArea , который принимает параметр Double (для радиуса), запрос XML-RPC должен выглядеть следующим образом:
<?xml version="1.0"?> <methodCall> <methodName>circleArea</methodName> <params> <param> <value><double>2.41</double></value> </param> </params> </methodCall>
Заголовки HTTP для этих запросов будут отражать отправителей и содержимое. Базовый шаблон выглядит следующим образом:
POST /target HTTP 1.0 User-Agent: Identifier Host: host.making.request Content-Type: text/xml Content-Length: length of request in bytes
Например, если метод circleArea был доступен с сервера XML-RPC, который прослушивает / xmlrpc , запрос может выглядеть следующим образом:
POST /xmlrpc HTTP 1.0 User-Agent: myXMLRPCClient/1.0 Host: 192.168.124.2 Content-Type: text/xml Content-Length: 169
В собранном виде весь запрос будет выглядеть так:
POST /xmlrpc HTTP 1.0 User-Agent: myXMLRPCClient/1.0 Host: 192.168.124.2 Content-Type: text/xml Content-Length: 169 <?xml version="1.0"?> <methodCall> <methodName>circleArea</methodName> <params> <param> <value><double>2.41</double></value> </param> </params> </methodCall>
Это обычный HTTP-запрос с тщательно сконструированной полезной нагрузкой.
XML-RPC — Формат ответа
Ответы очень похожи на запросы, с несколькими дополнительными поворотами. Если ответ успешен — процедура была найдена, выполнена правильно и вернула результаты — тогда ответ XML-RPC будет очень похож на запрос, за исключением того, что элемент methodCall заменяется элементом methodResponse, а элемент methodName отсутствует:
<?xml version="1.0"?> <methodResponse> <params> <param> <value><double>18.24668429131</double></value> </param> </params> </methodResponse>
-
Ответ XML-RPC может содержать только один параметр.
-
Этот параметр может быть массивом или структурой, поэтому можно возвращать несколько значений.
-
Всегда требуется возвращать значение в ответе. «Значение успеха» — возможно, логическое значение true (1).
Ответ XML-RPC может содержать только один параметр.
Этот параметр может быть массивом или структурой, поэтому можно возвращать несколько значений.
Всегда требуется возвращать значение в ответе. «Значение успеха» — возможно, логическое значение true (1).
Как и запросы, ответы упакованы в HTTP и имеют заголовки HTTP. Все ответы XML-RPC используют код ответа 200 OK, даже если в сообщении содержится ошибка. Заголовки используют общую структуру, аналогичную структуре запросов, и типичный набор заголовков может выглядеть следующим образом:
HTTP/1.1 200 OK Date: Sat, 06 Oct 2001 23:20:04 GMT Server: Apache.1.3.12 (Unix) Connection: close Content-Type: text/xml Content-Length: 124
-
XML-RPC требует только поддержки HTTP 1.0, но HTTP 1.1 совместим.
-
Тип содержимого должен быть установлен на text / xml.
-
Заголовок Content-Length указывает длину ответа в байтах.
XML-RPC требует только поддержки HTTP 1.0, но HTTP 1.1 совместим.
Тип содержимого должен быть установлен на text / xml.
Заголовок Content-Length указывает длину ответа в байтах.
Полный ответ с заголовками и полезной нагрузкой будет выглядеть следующим образом:
HTTP/1.1 200 OK Date: Sat, 06 Oct 2001 23:20:04 GMT Server: Apache.1.3.12 (Unix) Connection: close Content-Type: text/xml Content-Length: 124 <?xml version="1.0"?> <methodResponse> <params> <param> <value><double>18.24668429131</double></value> </param> </params> </methodResponse>
После доставки ответа от сервера XML-RPC клиенту XML-RPC соединение закрывается. Последующие запросы необходимо отправлять как отдельные соединения XML-RPC.
XML-RPC — формат ошибок
Ошибки XML-RPC являются типом ответов. Если при обработке запроса XML-RPC возникла проблема, элемент methodResponse будет содержать элемент fault вместо элемента params. Элемент сбоя, как и элемент params , имеет только одно значение, указывающее, что что-то пошло не так. Реакция на ошибку может выглядеть так:
<?xml version="1.0"?> <methodResponse> <fault> <value><string>No such method!</string></value> </fault> </methodResponse>
Ошибка также будет иметь код ошибки. XML-RPC вообще не стандартизирует коды ошибок. Вам нужно проверить документацию для конкретных пакетов, чтобы увидеть, как они обрабатывают сбои.
Реакция на ошибку также может выглядеть так:
<?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name>code</name> <value><int>26</int></value> </member> <member> <name>message</name> <value><string>No such method!</string></value> </member> </struct> </value> </fault> </methodResponse>
XML-RPC — Примеры
Чтобы продемонстрировать XML-RPC, мы собираемся создать сервер, который использует Java для обработки сообщений XML-RPC, и мы создадим Java-клиент для вызова процедур на этом сервере.
Java-часть беседы использует Apache XML-RPC Apache XML Project, доступный по адресу http://xml.apache.org/xmlrpc/.
Поместите все файлы .jar в соответствующий путь и позвольте нам создать один клиент и один маленький XML-RPC-сервер, используя JAVA.
XML-RPC клиент
Давайте напишем клиент XML-RPC для вызова функции, называемой функцией суммы . Эта функция принимает два параметра и возвращает их сумму.
import java.util.*; import org.apache.xmlrpc.*; public class JavaClient { public static void main (String [] args) { try { XmlRpcClient client = new XmlRpcClient("http://localhost/RPC2"); Vector params = new Vector(); params.addElement(new Integer(17)); params.addElement(new Integer(13)); Object result = server.execute("sample.sum", params); int sum = ((Integer) result).intValue(); System.out.println("The sum is: "+ sum); } catch (Exception exception) { System.err.println("JavaClient: " + exception); } } }
Давайте посмотрим, что произошло в приведенном выше примере клиента.
-
Пакет Java org.apache.xmlrpc содержит классы для клиентов Java XML-RPC и сервера XML-RPC, например XmlRpcClient.
-
Пакет java.util необходим для класса Vector.
-
Функция server.execute (…) отправляет запрос на сервер. Сумма процедуры (17,13) вызывается на сервере, как если бы это была локальная процедура. Возвращаемым значением вызова процедуры всегда является Object.
-
Здесь «образец» обозначает обработчик, который определен на сервере.
-
Обратите внимание, что все параметры вызова процедуры всегда собираются в векторе.
-
Класс XmlRpcClient создается путем указания «веб-адреса» сервера, за которым следует / RPC2.
-
localhost — означает локальный компьютер
-
Вы можете указать номер IP вместо localhost, например, 194.80.215.219
-
Вы можете указать доменное имя как xyz.dyndns.org
-
Вы можете указать номер порта вместе с именем домена как xyz.dyndns.org:8080. Порт по умолчанию — 80
-
-
Обратите внимание, что результатом удаленного вызова процедуры всегда является Object, и он должен быть приведен к соответствующему типу.
-
Когда возникают проблемы (нет соединения и т. Д.), Создается исключение, и оно должно быть перехвачено с помощью оператора catch .
Пакет Java org.apache.xmlrpc содержит классы для клиентов Java XML-RPC и сервера XML-RPC, например XmlRpcClient.
Пакет java.util необходим для класса Vector.
Функция server.execute (…) отправляет запрос на сервер. Сумма процедуры (17,13) вызывается на сервере, как если бы это была локальная процедура. Возвращаемым значением вызова процедуры всегда является Object.
Здесь «образец» обозначает обработчик, который определен на сервере.
Обратите внимание, что все параметры вызова процедуры всегда собираются в векторе.
Класс XmlRpcClient создается путем указания «веб-адреса» сервера, за которым следует / RPC2.
localhost — означает локальный компьютер
Вы можете указать номер IP вместо localhost, например, 194.80.215.219
Вы можете указать доменное имя как xyz.dyndns.org
Вы можете указать номер порта вместе с именем домена как xyz.dyndns.org:8080. Порт по умолчанию — 80
Обратите внимание, что результатом удаленного вызова процедуры всегда является Object, и он должен быть приведен к соответствующему типу.
Когда возникают проблемы (нет соединения и т. Д.), Создается исключение, и оно должно быть перехвачено с помощью оператора catch .
Из-за вышеуказанного вызова клиент отправляет на сервер следующее сообщение. Обратите внимание, что это обрабатывается внутри server.execute (…), и вы не имеете к этому никакого отношения.
<?xml version="1.0" encoding="ISO-8859-1"?> <methodCall> <methodName>sample.sum</methodName> <params> <param> <value><int>17</int></value> </param> <param> <value><int>13</int></value> </param> </params> </methodCall>
XML-RPC сервер
Ниже приведен исходный код сервера XML-RPC, написанный на Java. Он использует встроенные классы, доступные в org.apache.xmlrpc. *
import org.apache.xmlrpc.*; public class JavaServer { public Integer sum(int x, int y) { return new Integer(x+y); } public static void main (String [] args) { try { System.out.println("Attempting to start XML-RPC Server..."); WebServer server = new WebServer(80); server.addHandler("sample", new JavaServer()); server.start(); System.out.println("Started successfully."); System.out.println("Accepting requests. (Halt program to stop.)"); } catch (Exception exception) { System.err.println("JavaServer: " + exception); } } }
Давайте посмотрим, что мы сделали на приведенном выше примере сервера.
-
Пакет org.apache.xmlrpc содержит класс WebServer для реализации сервера XML-RPC.
-
Сумма процедуры, которая вызывается удаленно, реализована как открытый метод в классе.
-
Экземпляр того же серверного класса затем связывается с обработчиком, который доступен клиенту.
-
Сервер инициализируется номером порта (здесь: 80).
-
Когда возникают проблемы, генерируется исключение, которое должно быть перехвачено с помощью оператора catch .
Пакет org.apache.xmlrpc содержит класс WebServer для реализации сервера XML-RPC.
Сумма процедуры, которая вызывается удаленно, реализована как открытый метод в классе.
Экземпляр того же серверного класса затем связывается с обработчиком, который доступен клиенту.
Сервер инициализируется номером порта (здесь: 80).
Когда возникают проблемы, генерируется исключение, которое должно быть перехвачено с помощью оператора catch .
Для вызова, упомянутого в данном примере клиента, сервер отправляет клиенту следующий ответ:
<?xml version="1.0" encoding="ISO-8859-1"?> <methodResponse> <params> <param> <value><int>30</int></value> </param> </params> </methodResponse>
Теперь ваш сервер готов, поэтому скомпилируйте и запустите его, как показано ниже:
C:\ora\xmlrpc\java>java JavaServer Attempting to start XML-RPC Server... Started successfully. Accepting requests. (Halt program to stop.)
Теперь, чтобы проверить функциональность, позвоните на этот сервер следующим образом:
C:\ora\xmlrpc\java>java JavaClient 30
XML-RPC — Резюме
Из этого руководства вы узнали, что такое XML-RPC и зачем нам нужен XML-RPC. Мы обсудили его модель данных, а также формат сообщения запроса и ответа, которым должен обмениваться клиент и сервер. Мы привели один пример, чтобы продемонстрировать, как клиент и сервер XML-RPC работают для обмена информацией.
XML-RPC — это очень простая концепция с ограниченным набором возможностей. Эти ограничения во многих отношениях являются наиболее привлекательной особенностью XML-RPC, поскольку они существенно снижают сложность реализации протокола и тестирования его совместимости.
Хотя XML-RPC прост, креативное применение простых инструментов может создавать сложные и мощные архитектуры. В тех случаях, когда для взаимодействия требуется множество различных систем, XML-RPC может быть наиболее подходящим наименьшим общим знаменателем.
Что дальше?
Следующим шагом является изучение WSDL и SOAP.
WSDL
WSDL — это язык на основе XML для описания веб-сервисов и способов доступа к ним.
WSDL описывает веб-службу, а также формат сообщения и подробности протокола для веб-службы.
Если вы хотите узнать больше о WSDL, ознакомьтесь с нашим руководством по WSDL .
МЫЛО
SOAP — это простой протокол на основе XML, который позволяет приложениям обмениваться информацией по HTTP.
Если вы хотите узнать больше о SOAP, ознакомьтесь с нашим руководством по SOAP .