XML-RPC в Drupal 7

29.10.2011
XML-RPC in Drupal 7
Автор:

XML-RPC –простий протокол виклику віддалених процедур. XML-RPC можна вважати праотцем одного з популярних протоколів SOAP. Попри свій чималенький вік (реалізований в 1998 році) XML-RPC не відходить у минуле, а навпаки, часто використовується в наші дні. Також не є винятком XML-RPC в двигуні Drupal.

Вперше протокол XML-RPC був розроблений Дейвом Вінером з компанії «UserLand Software» у співпраці з Майкрософт'ом у 1998 році. Проте корпорація Майкрософт з часом вирішила що цей протокол надто простий, і заходилась розширявати його функціональність (як наслідок, був створений розширений протокол SOAP). Проте, не дивлячись на відторгнення з боку Майкрософт, стандарт XML-RPC зачарував багатьох програмістів своєю надзвичайною простотою і, завдяки їй, він проіснував до наших днів, і став навіть поступово набирати популярності. (Вікіпедія)

В Drupal XML - RPC розпочав своє існування починаючи з версії 4.6.  Невеликі зміни в роботі функціоналу мали місце з виходом 7 версії  Drupal .

Для початку давайте поставимо собі задачі, тобто вирішимо, для чого ми можемо використовувати протокол  XML - RPC.

У нашому розпорядженні 2 сайти: 

  • сайт «А»
  • сайт «B»

Задачі перед нами наступні: 

1. дізнатися про всі можливі методи сайту "В" знаходячись на сайті "А" .

2. створити функціонал, виводу кількості контенту. Знаходячись на сайті "А" з'ясувати кількість нод на сайті "В" і навпаки.

3. Створити функціонал на сайті "В" в момент, коли перебуваємо на сайті "А", і навпаки.

Задача 1

В друпалі є список системних методів, котрі стають доступними одразу ж після його інсталяції.  Список стандартних методів  такий: 

1. system.multicall - Системний метод, який дозволить викликати нам декілька інших  методів.

2. system.methodSignature - повертає масив з описом типу повертання і типу потрібних даних для обраного методу. 

3. system.getCapabilities - повертає структуру опису XML - RPC специфікації підтримуються цим сервером. 

4. system.listMethods -   виводить список доступних методів.

5. system.methodHelp - виводить стрічку опису для вказаного методу. 

Для вирішення задачі веб розробник потребуватиме метод system.listMethods , із допомогою якого виведемо всі методи сайту. 

Запит будь-якого методу виконується за допомогою функції  xmlrpc($url, $args, $options = array()).

Давайте розберемо аргументи функції,  їх всього 3: 

1. $url - абсолютна адреса до файлів запитів, наприклад: 

«/example.com/xmlrpc.php». 

2.$args - асоціативний масив, ключами якого являються методи, значення яких аргументи для передачі  відповідним методом . Якщо декілька методів не вказано system.multicall не виконується. 

3.  $options (не обов"язковий аргумент) -  параметри виконання запиту. 

Щоб отримати всі методи сайту "В" нам потрібно всього навсього написати наступний рядок коду: 

php
$methods = xmlrpc('http://site-b.com/xmlrpc.php', array('system.listMethods' => array())

в результаті виконання запиту, в нас виведеться масив з усіма доступними методами сайту "В".  Також можна отримати всі доступні методи на поточному сайті, варто лише змінити 1 аргумент  функції  xmlrpc, тобто змінити сайт до якого ми звертаємося. 

Задача 2

Для того щоб отримати кількість нод на іншому сайті нам потрібно створити свій метод.  Методи створюються за допомогою 

hook_xmlrpc().

В хуці ми повинні повертати масив, в якому є назва методу, тип вихідних даних, тип аргументів (якщо він є) і опис методу (не являється обовв"язковим).
В методи ми можемо передавати дані наступних типів:

  • boolean
  • double
  • int
  • array
  • struct
  • datebase64
  • string

Приклад реалізації hook_xmlrpc().

php
function internetdevels_xmlrpc_xmlrpc() {   
  $methods[] =  array(   
    'id_xmlrpc.node_count', // указываем название метода
    '_id_xmlrpc_node_count', // функция, которая запускаеться при вызове метода
    array('int'), // 1 значением массива обозначаем тип данных, 2 значение массива будет 1 аргументом в функции метода, 3 значение будет 2 аргументом фунукции и т.д.
    t('Return count of node') // описание к методу   
  );   
return $methods;   
} 

Отже, свій  hook_xmlrpc ми оголосили. Функція буде виконувати простий селект в БД і повертати кількість записів з таблиці node. ось і сама функція: 

php
function _id_xmlrpc_node_count() {   
  return db_select('node', 'n')   
    ->fields('n')   
    ->execute()   
    ->rowCount();   
} 

Зверніть увагу на те, що метод і функція повинні бути однакові - як на сайті "А" так і на сайті "В" . 

Тепер ми можемо отримати кількість записів в таблиці сайту "А" знаходячись на сайті "В". В моєму випадку запит буде такий: 

php
$ncount  = xmlrpc('http://site-b.com/xmlrpc.php', array('id_xmlrpc.node_count' => array()));

в  $ncount при вдалому запиті в нас буде число, яке і буде показувати кількість записів в таблиці node на сайті "В".

Задача 3

В даній задачі нам також знадобиться оголосити свій метод, в мому випадку в hook_xmlrpc буде задавати наступний метод: 

php
$methods[] =  array(   
    'id_xmlrpc.node_new_page',   
    '_id_xmlrpc_node_new_page',   
    array('string', 'array'),   
    t('Return count of node')   
  ); 

повертати будемо ссилку на створений матеріал, у функції буде 1 аргумент, який буде містити в собі масив. 

Функція виклику методу наступна : 

 php
function _id_xmlrpc_node_new_page($data) {   
  $node = new stdClass;   
  $node->title   = $data['title'];   
  $node->type    = 'page';   
  $node->created = REQUEST_TIME;   
  $node->status  = 1;   
  $node->body['und'][0]['value'] = $data['body'];   
  node_save($node);   
  if (is_numeric($node->nid)) {   
    return url('node/' . $node->nid, array('absolute' => TRUE));   
  }   
  else {   
    return '';   
  }   
} 

Далі ми можемо викликати метод, який створить нам контент, і якщо контент буде створений успішно,  у відповідь на запит ми отримаємо на нього ссилку.

Тепер знаходячись на сайті "А", ми можемо створити нову ноду на сайті "В".  Зверніть увагу на те, що такий метод повинен знаходитися на сайті "В". В моєму випадку, щоб створити контент на іншому сайті , я пропишу функцію так:

php
$options = array('id_xmlrpc.node_new_page' => array( // создаем переменную с названием метода и опциями запроса
    array(   
      'title' => 'Title of the new node', // заголовок контента
      'body'  => 'Body of the new node' // текст контента
    )   
  ));   
// запускаем функцию xmlrpc   
$node_link  = xmlrpc('http://site-b.com/xmlrpc.php', $options); 

За умови вдалого виконання запиту, в $node_link ми будемо мати ссилку на контент, який створили.

Висновок:  

Не зважаючи на те, що протокол  XML-RPC створений уже достатньо давно, він залишається актуальним по сьогоднішній день. Оскільки допомагає вирішувати різноматінті задачі взаємодії 2-х і більше сайтів між собою.  Для побудови запиту потрібно використовувати всього-навсього одну лише функцію, в якій можна вказувати прості параметри що спрощує роботу з протоколом XML-RPC.

Голосів: 1 Рейтинг: 5

Також по темі

1

В пості ми розкриємо основи створення середовища для розробки Drupal проектів на основі Debian 6 "Squeeze". Маючи дане підгрунтя, кожен зможе попрактикуватись в налаштуванні сервісів ОС.

2

В даній статті на Ваш розгляд буде представлена інформація про можливості платформи Titanium Appcelerator. Також стаття дає можливість познайомитись із частовживаними об'єктами групи Titanium.UI:...

3

В попередній статті розповідалось про створення інсталяційних профілів для Drupal 6. В даній статті буде розказано про...

4

В Drupal 7 API є цілий розділ, присвячений темізації сайту. Всі елементи сайту без виключення повинні пройти процес темізації. 

5

При розробці часом виникає необхідність виконати такі дії/команди, для яких недостатньо прав чи відсутній доступ до певних директорій у користувача з під якого запущений на сервері та виконується...

Subscribe to our blog updates