Периодически бывает нужно скачать какой-нибудь файл из сети или выполнить запрос к API и всегда встает вопрос "Чем?".
Проблем на самом деле 2 (по крайней мере у меня в голове):
И вот тут обычно возникает желание написать свой велосипед. Когда в очередной раз у меня возникло такое желание наткнулся на замечательный класс в новом ядре: Bitrix\Main\Web\HttpClient. И это было очень приятной неожиданностью. Он может и файл скачать и запрос к API отправить и все через сокеты (есть везде, не считаются опасными).
Выглядит работа с ним вот так:
и вот так
Так что всем рекомендую: кроссерверно, безопасно, из коробки.
Сам использую уже во втором модуле - пока полет нормальный.
Проблем на самом деле 2 (по крайней мере у меня в голове):
- CURL (который все всегда советуют для этого) может быть не подключен как расширение php. Можно доустановить, донастроить - но типичный владелец сайта обычно вообще без понятия о чем это.
- URL fopen (который вторым приходит на ум) считается небезопасным (монитор безопасности рекомендует отключать эту возможность)
И вот тут обычно возникает желание написать свой велосипед. Когда в очередной раз у меня возникло такое желание наткнулся на замечательный класс в новом ядре: Bitrix\Main\Web\HttpClient. И это было очень приятной неожиданностью. Он может и файл скачать и запрос к API отправить и все через сокеты (есть везде, не считаются опасными).
Выглядит работа с ним вот так:
use Bitrix\Main\Web\HttpClient; $httpClient = new HttpClient(); $httpClient->setHeader('Content-Type', 'application/json', true); $response = $httpClient->post('http://www.example.com', json_encode(array('x' => 1))); |
use Bitrix\Main\Web\HttpClient; $httpClient = new HttpClient(); $httpClient->download('http://www.example.com/robots.txt', $_SERVER['DOCUMENT_ROOT'].'/upload/my.txt'); |
Сам использую уже во втором модуле - пока полет нормальный.
Ковыряйте глубже.
$photos = [
$_SERVER['DOCUMENT_ROOT'] . '/upload/iblock/cde/cde84811574e53d9693961e936a5183f.jpg',
$_SERVER['DOCUMENT_ROOT'] . '/upload/iblock/956/9561cc8ba010d665609f8b184b0b22dd.jpg',
$_SERVER['DOCUMENT_ROOT'] . '/upload/iblock/7e3/7e3e5421d2495772ec6f4db3a2383a78.jpg',
];
$uploadFiles = [];
foreach ($photos as $fname)
{
$uploadFiles[] = [
'resource' => fopen($fname, 'r'),
//'filename' => $name
];
}
$client = new HttpClient();
$resUpload = $client->post($res['upload_url'], $uploadFiles, true);
и еще - download метод реализовали для загрузки
а обертку для upload не осилили сделать
там WSDL нужно отправлять в запросе POST в теле (BODY) определенный XML
так вот пытаюсь это сделать через HttpClient
вот так
if(!count($headers) || empty($host) || empty($content)){
return false;
}
$httpClient = new HttpClient();
foreach($headers as $name=>$value){
$httpClient->setHeader($name, $value, true);
}
if($method=='POST') {
$response = $httpClient->post($host, $content);
}else{
$response = $httpClient->get($host, $content);
}
return $response;
}
в $content как раз содержится этот XML, правильно ли я делаю или нет?
Исходил из этого примера где таким же образом передается JSON