XML-RPC: теоретична частина
1. Загальні поняття про XML-RPC
RPC та XML-RPC
RPC означає Remote Procedure Call (віддалений виклик процедури). Як випливає з назви, це механізм виклику процедури або функції, яка знаходиться на віддаленому комп’ютері. RPC є значно старішою технологією, ніж Web. Фактично RPC надає розробникам механізм означення інтерфейсів, які можуть викликатися через мережу. Ці інтерфейси можуть бути як дуже простими, наприклад один виклик функції, так і дуже складними, наприклад великий API.
XML-RPC є одним із найпростіших і найбільш надійних підходів до реалізації веб-сервісів, який дозволяє комп’ютерам легко викликати процедури на інших комп’ютерах.
- XML-RPC дозволяє програмам виконувати виклики функцій або процедур через мережу.
- XML-RPC використовує протокол HTTP для передавання інформації від клієнтського комп’ютера до серверного комп’ютера.
- XML-RPC використовує невеликий словник XML для опису характеру запитів і відповідей.
- Клієнт XML-RPC вказує ім’я процедури та параметри в XML-запиті, а сервер повертає або помилку (fault), або відповідь у XML-форматі.
- Параметри XML-RPC являють собою простий список типів і значень; найскладнішими доступними типами є структури (struct) та масиви (array).
- XML-RPC не має поняття об’єктів і не має механізму для включення інформації, що використовує інші словники XML.
- У випадку XML-RPC та веб-сервісів Web фактично перетворюється на сукупність процедурних з’єднань, де комп’ютери обмінюються інформацією за чітко визначеними шляхами.
- XML-RPC з’явився на початку 1998 року; його опублікувала компанія UserLand Software, і спочатку він був реалізований у їхньому продукті Frontier.
Область використання
Якщо потрібно інтегрувати кілька обчислювальних середовищ, але немає потреби безпосередньо обмінюватися складними структурами даних, XML-RPC дозволяє швидко і просто встановити взаємодію між системами.
Навіть якщо робота виконується в одному середовищі, підхід RPC може спростити з’єднання програм, які мають різні моделі даних або різні очікування щодо обробки. Крім того, він може забезпечити простий доступ до повторно використовуваної логіки.
- XML-RPC є ефективним інструментом для встановлення різноманітних з’єднань між комп’ютерами.
- XML-RPC надає інтеграторам можливість використовувати стандартний словник і підхід для обміну інформацією.
- Найочевиднішою сферою застосування XML-RPC є з’єднання різних середовищ, наприклад коли Java взаємодіє з Perl, Python, ASP тощо.
Технічний огляд XML-RPC
XML-RPC складається з трьох відносно невеликих частин:
- модель даних XML-RPC – набір типів, що використовуються для передавання параметрів, значень результату та повідомлень про помилки (fault);
- структура запиту XML-RPC – HTTP-запит типу POST, що містить інформацію про метод і параметри;
- структура відповіді XML-RPC – HTTP-відповідь, що містить значення результату або інформацію про помилку.
У наступних трьох розділах буде розглянуто кожен із цих компонентів.
2. Модель даних
Специфікація XML-RPC означує шість базових типів даних і два складені типи даних, які представляють комбінації цих типів.
Базові типи даних у XML-RPC
| Тип | Значення | Приклади |
|---|---|---|
| int або i4 | 32-бітні цілі числа в діапазоні від -2 147 483 648 до 2 147 483 647 | <int>27</int><i4>27</i4> |
| double | 64-бітні числа з плаваючою комою | <double>27.31415</double><double>-1.1465</double> |
| boolean | true (1) або false (0) | <boolean>1</boolean><boolean>0</boolean> |
| string | ASCII-текст, хоча багато реалізацій підтримують Unicode | <string>Hello</string><string>bonkers! @</string> |
| dateTime.iso8601 | Дати у форматі ISO8601: CCYYMMDDTHH:MM:SS | <dateTime.iso8601>20021125T02:20:04</dateTime.iso8601><dateTime.iso8601>20020104T17:27:30</dateTime.iso8601> |
| base64 | Бінарна інформація, закодована у форматі Base64 відповідно до RFC 2045 | <base64>SGVsbG8sIFdvcmxkIQ==</base64> |
Ці базові типи завжди розміщуються всередині елементів value. Рядки (і тільки рядки) можуть бути розміщені всередині елемента value без використання елемента string.
Ці базові типи можуть бути об’єднані у два складніші типи: arrays та structs. Масиви (arrays) представляють послідовні дані, тоді як структури (structs) представляють пари ім’я-значення, подібно до хеш-таблиць, асоціативних масивів або властивостей.
Масиви позначаються елементом array, який містить елемент data з переліком значень. Як і інші типи даних, елемент array повинен бути розміщений всередині елемента value.
Наприклад, наведений нижче масив містить чотири рядки:
<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>
Проста структура (struct) може виглядати так:
<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>
Таким способом можна реалізувати майже всі типи даних, що підтримуються будь-якою мовою програмування.
3. Формати запиту і відповіді
Формат запиту
Запити XML-RPC є комбінацією XML-вмісту та HTTP-заголовків. XML-вміст використовує структуру типізації даних для передавання параметрів і містить додаткову інформацію, яка означує, яку процедуру потрібно викликати, тоді як HTTP-заголовки забезпечують оболонку для передавання запиту через Web.
Кожен запит містить один XML-документ, кореневим елементом якого є елемент methodCall. Кожен елемент methodCall містить елемент methodName і елемент params. Елемент methodName означує ім’я процедури, яку потрібно викликати, тоді як елемент params містить список параметрів і їх значень. Кожен елемент params включає список елементів param, які у свою чергу містять елементи value.
Наприклад, щоб передати запит до методу з назвою 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 відповідь виглядає майже так само, як запит, за винятком того, що елемент methodCall замінюється елементом methodResponse, і елемент methodName відсутній:
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><double>18.24668429131</double></value>
</param>
</params>
</methodResponse>
- XML-RPC відповідь може містити лише один параметр.
- Цей параметр може бути масивом (
array) або структурою (struct), тому можливо повернути кілька значень. - У відповіді завжди потрібно повертати значення. Це може бути «значення успіху», наприклад логічне значення
Boolean, встановлене уtrue(1).
Як і запити, відповіді передаються через HTTP і мають HTTP-заголовки. Усі відповіді XML-RPC використовують код відповіді 200 OK, навіть якщо повідомлення містить помилку (fault). Заголовки мають структуру, подібну до заголовків запитів, і типовий набір заголовків може виглядати так:
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 також є сумісним.
- Заголовок
Content-Typeповинен мати значення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 з’єднання.
Формат помилки
Помилки (fault) у XML-RPC є різновидом відповіді. Якщо під час обробки XML-RPC запиту виникла проблема, елемент methodResponse міститиме елемент fault замість елемента params. Елемент fault, як і елемент params, містить лише одне значення, яке вказує, що сталася помилка. Приклад відповіді з помилкою може виглядати так:
<?xml version="1.0"?>
<methodResponse>
<fault>
<value><string>No such method!</string></value>
</fault>
</methodResponse>
Помилка (fault) також містить код помилки. 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>
4. Приклади
Щоб продемонструвати 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 клієнт, який викликає функцію з назвою sum. Ця функція приймає два параметри і повертає їх суму.
…
Підсумок
XML-RPC є дуже простою концепцією з обмеженим набором можливостей. Саме ці обмеження у багатьох випадках є найбільш привабливою рисою XML-RPC, оскільки вони суттєво зменшують складність реалізації протоколу та перевірки його сумісності.
Хоча XML-RPC є простим, творче використання простих інструментів може дозволити створювати складні та потужні архітектури. У випадках, коли потрібно забезпечити взаємодію між великою кількістю різнорідних систем, XML-RPC може бути найбільш придатним спільним мінімальним знаменником.
Наступним кроком є ознайомлення з WSDL та SOAP.
- SOAP є простим протоколом на основі XML, який дозволяє застосункам обмінюватися інформацією через HTTP. Якщо ви хочете дізнатися більше про SOAP, ознайомтеся з відповідним посібником з SOAP.
- WSDL є мовою на основі XML, призначеною для опису веб-сервісів і способів доступу до них. WSDL описує веб-сервіс разом із форматом повідомлень і деталями протоколу, що використовуються цим веб-сервісом. Якщо ви хочете дізнатися більше про WSDL, ознайомтеся з відповідним посібником з WSDL.
https://xmlrpc.com/spec.md
https://www.tutorialspoint.com/xml-rpc/index.htm
Теоретичне заняття розробив Прізвище або нік розробника Імя.