Yandex Metrika
sanches.free 5 просмотров

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();   // 443

HttpClient: опции и «ручки» перед запросом

Конструктор принимает массив настроек: следование редиректам, их лимит, версия протокола, таймауты сокета и чтения, 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 дней гарантии