Написал перевод-компиляцию 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
, используют одинаковые аргументы:
- URL - url вызова, end-point.
- Data - массив данных, отправляемых в запросе.
- Headers - заголовки http-запроса. Могут использоваться, например, для авторизации.
- 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 с изменениями и доработками.
От читателей приветствую пожелания и уточнения по терминологии.
Список источников: