Саратовский железнодорожный мост, логотип джумла и текст HttpFactory

Написал перевод-компиляцию 3-х статей на хабре, которая будет полезна разработчикам при интеграции Joomla со сторонними сервисами по API. Дублирую текст себе.

Обычно когда мы хотим сделать внешний запрос мы используем для этих целей cURL. Настройка cURL довольно громоздкая, да и в принципе проблематично держать в голове все необходимые настройки. Также есть сервера без поддержки cURL, а значит Ваш код не будет работать. В этих случаях нужен запасной вариант.

С использованием Joomla довольно легко настроить cURL и все необходимые резервные варианты подключений в одной строчке кода.

use Joomla\CMS\Http\HttpFactory;
$http = HttpFactory::getHttp(null, ['curl', 'stream']);

Этот код вызывает драйвер Joomla Http, позволяющий делать исходящие запросы на внешние URL. Этот драйвер использует драйверы транспорта в указанном порядке, то есть в данном случае в начале cURL (если доступен), а затем stream.

В Joomla 3 "из коробки" доступны 3 драйвера транспорта:

  • cURL
  • socket
  • stream

HttpFactory в Joomla 4

В Joomla 4 изменены типы методов. Теперь вызов осуществляется не статическим методом (без двоеточия). Например, следующим образом:

$http = (new \Joomla\Http\HttpFactory)->getHttp(array(), ['curl', 'stream']);

Также обратите внимание, что первый параметр теперь не может быть null, это должен быть массив.

Создание вызова

HttpFactory в Joomla 3 поддерживает следующие типы HTTP-запросов:

  • delete
  • get
  • head
  • options
  • patch
  • post
  • put
  • trace

Все эти методы, кроме GET, используют одинаковые аргументы:

  1. URL - url вызова, end-point.
  2. Data - массив данных, отправляемых в запросе.
  3. Headers - заголовки http-запроса. Могут использоваться, например, для авторизации.
  4. Timeout - установка специфичного таймаута для запроса.

В методе GET отсутствует параметр $data. Используются только $url, $headers, $timeout.

Пример POST-запроса

$answer = $http->post($url);

POST-запрос с данными 

$answer = $http->post($url, ['foo' => 'bar']);

Добавление опций запроса

HttpFactory может добавлять опции настроек для драйвера транспорта. Для этого нужно создать массив, где ключ - это опция, а значение - значение опции соответственно. Ниже примеры опций для cURL. Полный список в документации PHP.

$curlOptions = array();
$curlOptions[CURLOPT_SSL_VERIFYHOST] = false;

Далее добавляем массив с опциями с помощью метода setOption().

$http->setOption('transport.curl', $curlOptions);

Ещё одним вариантом указания опций запроса может быть создание экземпляра класса сразу с заранее заданными опциями. При этом возможно (и это удобно) использовать класс Joomla\Registry\Registry для операций с массивами и объектами.


<?php
use Joomla\Registry\Registry;
use Joomla\CMS\Http\HttpFactory;

$options = new Registry();
$options->set('userAgent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0');

$options->set(
	'transport.curl',
	[
		CURLOPT_SSL_VERIFYPEER => false,
		CURLOPT_SSL_VERIFYHOST => false,
		CURLOPT_PROXY          => null,
		CURLOPT_PROXYUSERPWD   => null,
	]
);
$http = (new HttpFactory)->getHttp($options, ['curl', 'stream']);

Токены аутентификации в заголовках Http-запроса Joomla

Joomla может взаимодействовать с внешним миром получая или отправляя данные. Многие сервисы требуют наличие заголовков запроса с токенами аутентификации. Подробнее в Обзоре способов и протоколов аутентификации в веб-приложениях.

Добавить нужные заголовки весьма просто. Создаем массив с нужными заголовками, а затем указываем его при создании Http-запроса.

 

if(!empty($access_token) && !empty($user_key)){
            $headers = array(
                'Authorization' => 'AccessToken '.$access_token,
                'Content-Type'  => 'application/json',
                'charset'       => 'UTF-8',
                'X-User-Authorization'=> 'Basic '.$user_key
            );

        if(!is_null($data)){
            $headers['Content-Length'] = strlen($data);
        }
		$http->post($url,$data,$headers);
}

Далее уже оборачиваем запрос в try-catch и обрабатываем ошибки.

Обработка ответа

Ответом всегда является объект класса HttpResponse. Он имеет 3 свойства:

  • code - код ответа сервера (200, 400, 301 и т.д.)
  • headers - заголовки ответа сервера
  • body - собственно тело ответа сервера

Заключение

В процессе работы над интеграцией Joomla с внешними сервисами родилась идея этой статьи, которую предполагал писать сам. Однако, нашлись вполне адекватные зарубежные источники и данная статья является переводом и компиляцией трёх небольших статей о Joomla 3 HttpFactory с изменениями и доработками.

От читателей приветствую пожелания и уточнения по терминологии.

Список источников:

Толкачев Сергей Юрьевич
Толкачев Сергей Юрьевич

Joomla-разработчик. Контрибьютер ядра Joomla. Один из ведущих Telegram-канала русскоязычного Joomla-сообщества JoomlaFeed, один из модераторов чата русскоязычного Joomla-сообщества. Мои расширения в официальном маркетплейсе расширений Joomla - Joomla Extensions Directory. Имею публикации в официальном журнале международного Joomla-сообщества - Joomla Community Magazine.

Муж. Отец 3 детей.

Россия, Саратов.

Расширения Joomla WebTolk

90 Всего расширений
11 Категорий
399 Выпущено версий
386889 Всего скачиваний
Корзина
Корзина пуста