HttpClient: исходящие запросы
Встроенный Bitrix\Main\Web\HttpClient поддерживает как классический синхронный режим (get(), post()), так и современный стандарт PSR-18 с параллельной отправкой запросов. При интеграциях с внешними API необходимо явно задавать таймауты подключения и отключать доступ к приватным IP-адресам (setPrivateIp(false)) для защиты от SSRF-атак.
Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.
Что нужно понимать
-
1
Bitrix\Main\Web\HttpClient
-
2
Таймауты, заголовки, авторизация
-
3
Параллельные запросы
-
4
Логирование запросов
Материалы
Официальная документация
-
Конфигурация ядра: раздел «HTTP-клиент» Новая дока
Материалы BXMax
Проверь себя
Страница оформления заказа зависла на минуту у всех пользователей одновременно. При чём тут HttpClient?
Служба доставки не отвечала, а клиент с умолчаниями ждал 30 секунд соединения (socketTimeout) и 60 секунд ответа (streamTimeout) на каждом хите. Таймауты задают через setTimeout() и setStreamTimeout() или проектно в секции http_client_options.
Код делает json_decode от результата get() и дальше работает с null. Что пропущено?
Проверка на false: в legacy-режиме get() возвращает false при сетевой ошибке, а причину отдаёт getError(). Без проверки ошибка сети превращается в пустой массив и молчаливо ломает логику дальше.
Пользователь указывает URL картинки, сервер её скачивает через HttpClient. Какой параметр обязателен и почему?
setPrivateIp(false): по умолчанию privateIp включён, и клиент пойдёт на 127.0.0.1 или внутреннюю сеть, если подсунуть такой адрес. Это SSRF в чистом виде.
Нужно опросить пять складов, каждый отвечает по две секунды. Как уложиться в две секунды вместо десяти?
Режим PSR-18: sendAsyncRequest() для каждого Http Request ставит запрос в очередь, wait() выполняет их параллельно и отдаёт ответы, а Promise сохраняет соответствие ответа запросу.
Не сходится?
Спросите ассистента BXMax: он знает документацию и материалы сайта по этой теме.
Знаете материал лучше?
Предложите ссылку: после проверки она появится в этом разделе.
Войти, чтобы предложить