Обычно когда мы хотим сделать внешний запрос мы используем для этих целей cURL. Настройка cURL довольно громоздкая, да и в принципе проблематично держать в голове все необходимые настройки. Также есть сервера без поддержки cURL, а значит Ваш код не будет работать. В этих случаях нужен запасной вариант.
С использованием Joomla довольно легко настроить cURL и все необходимые резервные варианты подключений в одной строчке кода.
use Joomla\CMS\Http\HttpFactory;
$http = HttpFactory::getHttp(null, ['curl', 'stream']);
Этот код вызывает драйвер Joomla Http, позволяющий делать исходящие запросы на внешние URL. Этот драйвер использует драйверы транспорта в указанном порядке, то есть в данном случае в начале cURL (если доступен), а затем stream.
В Joomla 3 "из коробки" доступны 3 драйвера транспорта:
$answer = $http->post($url);
POST-запрос с данными
$answer = $http->post($url, ['foo' => 'bar']);
$curlOptions = array();
$curlOptions[CURLOPT_SSL_VERIFYHOST] = false;
Далее добавляем массив с опциями с помощью метода setOption().
$http->setOption('transport.curl', $curlOptions);
Добавить нужные заголовки весьма просто. Создаем массив с нужными заголовками, а затем указываем его при создании 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 и обрабатываем ошибки.
От читателей приветствую пожелания и уточнения по терминологии.
Список источников:
Источник статьи: https://habr.com/ru/post/568996/
С использованием 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 3 поддерживает следующие типы HTTP-запросов:- delete
- get
- head
- options
- patch
- post
- put
- trace
- URL - url вызова, end-point.
- Data - массив данных, отправляемых в запросе.
- Headers - заголовки http-запроса. Могут использоваться, например, для авторизации.
- Timeout - установка специфичного таймаута для запроса.
$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 может взаимодействовать с внешним миром получая или отправляя данные. Многие сервисы требуют наличие заголовков запроса с токенами аутентификации. Подробнее в Обзоре способов и протоколов аутентификации в веб-приложениях.Добавить нужные заголовки весьма просто. Создаем массив с нужными заголовками, а затем указываем его при создании 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 с изменениями и доработками.От читателей приветствую пожелания и уточнения по терминологии.
Список источников:
- Making external calls using HttpFactory
- Post credentials using HttpTransport
- Add extra cURL options in HttpTransport
Источник статьи: https://habr.com/ru/post/568996/