HTTP-клиент в Битрикс D7: Main\Web\HttpClient и Uri
Зачем не обходиться сырым curl
При обмене с внешним API, загрузке счетов или парсинге фидов часто тянутся fopen, file_get_contents или наследие в виде CHTTP. В D7 есть связка Bitrix\\Main\\Web\\Uri и Bitrix\\Main\\Web\\HttpClient: предсказуемые таймауты, редиректы, заголовки и чтение ответа через один объект без ручной сборки cURL.
Uri: собрать строку запроса без ошибок
Класс разбирает URL по частям и умеет пересобрать строку после правок параметров — аналог аккуратного http_build_query поверх уже существующего адреса. Ниже — вымышленный трекинг отгрузки: логин/пароль в URL показаны для примера parse_url; на бою секреты лучше не класть в query.
use Bitrix\Main\Web\Uri;
$despatchNotice = new Uri(
'https://svc:staging-key@carrier.example/track/?batch=MSK-8842&lane=express#changelog'
);
$despatchNotice->getLocator(); // без фрагмента
$despatchNotice->getPath();
$despatchNotice->getQuery();
$despatchNotice->deleteParams(['lane']);
$despatchNotice->addParams(['lane' => 'economy']);
// кириллица будет процент-encoded
$despatchNotice->addParams(['note' => 'Поставка после 18:00']);
$assembled = $despatchNotice->getUri();
$httpsEndpoint = new Uri('https://notify.partner.dev/hooks/order/');
$httpsEndpoint->getScheme(); // https
$httpsEndpoint->getPort(); // 443HttpClient: опции и «ручки» перед запросом
Конструктор принимает массив настроек: следование редиректам, их лимит, версия протокола, таймауты сокета и чтения, gzip через compress, кодировку тела для POST/PUT, прокси. С версии ядра 16.0.14 часть значений по умолчанию можно задать глобально в .settings.php в ключе http_client_options.
use Bitrix\Main\Web\HttpClient;
$fulfilmentBroker = new HttpClient([
'redirect' => true,
'redirectMax' => 6,
'waitResponse' => true,
'socketTimeout' => 15,
'streamTimeout' => 55,
'version' => HttpClient::HTTP_1_1,
'compress' => true,
'charset' => 'UTF-8',
]);
$fulfilmentBroker->setHeader('Accept', 'application/json', true);
$fulfilmentBroker->setCookies(['trace_ref' => 'bx-agent-991']);
// $fulfilmentBroker->setAuthorization('apiUser', 'apiPass');
// $fulfilmentBroker->disableSslVerification(); // только временно при отладкеСеттеры дублируют опции: setRedirect(), waitResponse(), setTimeout(), setStreamTimeout(), setVersion(), setProxy(), setCompress(), setCharset(). У setHeader() третий аргумент — заменить заголовок (true, по умолчанию) или добавить ещё строку с тем же именем (false).
Выполнение запроса и разбор ответа
Универсальный метод — query($verb, $url, $entityBody = null); для метода можно брать строку GET/POST или константы HttpClient::HTTP_GET, ::HTTP_POST, ::HTTP_PUT, ::HTTP_HEAD, ::HTTP_PATCH. Также есть сокращения: get()/post() возвращают тело ответа, head() — объект заголовков. Двоичную выгрузку удобно делать методом download(), передавая целевой путь на диске (часто в связке с Bitrix\\Main\\Application::getDocumentRoot()).
use Bitrix\Main\Web\HttpClient;
$hubsync = new HttpClient(['socketTimeout' => 10, 'streamTimeout' => 40]);
$hubsync->setHeader('Content-Type', 'application/json; charset=UTF-8', true);
$requestBody = json_encode(
['transfer_id' => 'wh-7734', 'pallets' => 2],
JSON_UNESCAPED_UNICODE
);
$okFlag = $hubsync->query(
HttpClient::HTTP_POST,
'https://edi.supplier.lab/outbox/ack',
$requestBody
);
if (!$okFlag) {
$issues = $hubsync->getError();
}
$responseCode = $hubsync->getStatus();
$responseText = $hubsync->getResult();
$contentTypeHeader = $hubsync->getContentType();
$landingUrl = $hubsync->getEffectiveUrl(); // финальный URI после цепочки редиректовHttpCookies и HttpHeaders из аксессоров превращаются в массив через toArray(). Если ответ нужен только текстом без детального разбора, для GET/POST можно вызвать краткие методы клиента напрямую.
Практика на продакшене
- Всегда задавайте таймауты: висящие запросы вебхуков и агентов легко блокируют пул PHP-FPM.
- Не отключайте проверку SSL без крайней необходимости; для отладки лучше валидный сертификат на стенде.
- Разграничивайте ошибки транспорта (
getError()) и бизнес-логики по HTTP-коду (getStatus()). - Следите за кодировкой: при смешении Windows-1251 и UTF-8 выставляйте
charsetявно перед POST.
Итог
Uri снимает боль склейки query string и правок параметров; HttpClient даёт управляемый HTTP-транспорт в духе D7. Такой код проще поддерживать, чем разрозненные обёртки над cURL по проекту.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии