atpv

Навчальні матеріали з автоматизації технологічних процесів та виробництв, розроблені спільнотою

<- До підрозділу

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

Теоретичне заняття розробив Прізвище або нік розробника Імя.