Использование Drupal в качестве клиента веб-сервиса

8

Мне нужно использовать Drupal в качестве клиента для веб-службы, для извлечения данных и их отображения в виде или в виде контента. (Используется формат JSON или REST.)

Я использую модуль клиента Web-сервиса в Drupal 7 и модуль Services в Drupal 6, но я не знаю, как их использовать. Я прочитал документацию, но не получил никакого результата.

Может кто-нибудь помочь в этом вопросе, или подскажите, как использовать эти модули? Есть ли другой модуль для этой цели?


Возможное решение: я нахожу модуль под названием XML VIEWS, но этот модуль конвертирует только файлы XML.

Теперь я программирую в этом модуле преобразование JSON в XML.

В этих файлах: xml_views_plugin_query_xml.inc

В этой функции: Выполнить

У кого-нибудь есть другое решение?

Dvex
источник
Были некоторые хорошие презентации по этому вопросу на Остине (11) DrupalCamp: vimeo.com/33785095 vimeo.com/33091201
chrisjlee

Ответы:

9

У Drupal есть специальные функции, которые могут помочь в общении с веб-сервисом и обработке ввода JSON.
Drupal 7 имеет следующие функции:

  • drupal_http_request () - это функция для отправки HTTP-запроса к удаленному сайту, которая обрабатывает GET, POST, PUT или любые другие HTTP-запросы; он также обрабатывает перенаправления.
  • drupal_http_build_query () преобразует массив в rawurlencode()строку -d.
  • drupal_json_decode () декодирует строку JSON в коде PHP.
  • drupal_json_encode () кодирует переменную PHP в строку, которая обрабатывается JSON.

С помощью этих функций вы можете написать свой собственный модуль для отправки запросов на сайт, реализующий веб-сервис.

Если существуют некоторые ограничения на количество запросов, которые могут быть сделаны к веб-серверу, вы можете использовать функции Drupal для кэширования результатов, полученных с веб-сервера:

  • cache_get () , чтобы получить данные, сохраненные в кеше
  • cache_set () , чтобы сохранить данные в кеше

Заметьте, что Drupal поддерживает более одной корзины, и модули могут использовать свои собственные корзины, когда это необходимо.
Drupal также поддерживает элементы кэша, которые автоматически удаляются при последовательном пролистывании кэша (см. Описание константы CACHE_TEMPORARY ). Реализация hook_flush_caches () , модули позволяют пользователям администраторских очистить кэш , используемый модулем , когда кнопка «Очистить» на странице «Performance» нажата, или любое время модуль вызывает drupal_flush_all_caches () .

В Drupal 7 данные кэша для часто используемых данных связаны со статической переменной, обрабатываемой с помощью drupal_static () . Когда данные действительно часто используются при выводе одной и той же страницы, используется код, подобный следующему:

  // Use the advanced drupal_static() pattern, since this is called very often.
  static $drupal_static_fast;
  if (!isset($drupal_static_fast)) {
    $drupal_static_fast['implementations'] = &drupal_static(__FUNCTION__);
  }
  $implementations = &$drupal_static_fast['implementations'];

  // …

  // Fetch implementations from cache.
  if (empty($implementations)) {
    $implementations = cache_get('module_implements', 'cache_bootstrap');
    if ($implementations === FALSE) {
      $implementations = array();
    }
    else {
      $implementations = $implementations->data;
    }
  }

Код является частью module_implements () .

киамлалуно
источник
Вы пробовали drupal.org/project/wsclient ? Мне интересно, помогает ли этот модуль в реализации ws клиента
milkovsky
2

Каждый раз, когда мне нужно было воспользоваться веб-сервисом , я только что создал класс PHP, основанный на file_get_contents или curl в сочетании с json_decode или simplexml_load_string .

Затем к классу получают доступ в модуле через функцию получения, которая использует drupal_static , или $staticшаблон для Drupal 6.

Затем я использую это в своих пользовательских блоках, обратных вызовах меню и т. Д. По мере необходимости.

РЕДАКТИРОВАТЬ

Ответ @ kiamlaluno правильный и демонстрирует способ сделать это через API Drupal. Основная причина, по которой я этого не делаю, заключается в том, что я предпочитаю абстрагировать класс веб-сервиса таким образом, чтобы я мог использовать его в других приложениях. У этого есть свои преимущества и недостатки, поэтому взвесите ваши варианты.

mpdonadio
источник
Означает ли это, что я планирую использовать данные из веб-службы? Есть ли решение как sitebuilder с модулями?
Dvex
Извините, но я не совсем понимаю, что вы пытаетесь сделать.
mpdonadio
Другими словами, я ищу решение, которое не требует программирования. Решение как конструктор сайтов с модулями. Но, если в моем случае нужно программировать, мне нужны шаги для этого.
Dvex
Не могли бы вы привести пример абстрактного класса веб-сервиса?
Милковский