При интеграции 1С с внешними сервисами по REST API (включая сервисы с документацией Swagger) разработчики используют штатные объекты HTTPСоединение и HTTPЗапрос. Однако при выполнении метода ОтправитьДляОбработки или ВызватьHTTPМетод может возникнуть исключение: «Ошибка при вызове метода контекста (ОтправитьДляОбработки): Ошибка работы с Интернет: Failure when receiving data from the peer».
Рассмотрим пример рабочего кода для отправки JSON-запроса, проанализируем причины возникновения этой ошибки и разберем способы её устранения.
Рассмотрим корректную реализацию формирования и отправки POST-запроса с телом в формате JSON и авторизационными данными.
Сформируем функцию для создания объекта HTTPЗапрос:
Функция HTTPЗапросКСервисуБиллинга()
ТекстЗапроса = "/api/Auth/";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
Заголовки.Вставить("Accept", "application/json");
Заголовки.Вставить("User-Agent", "1CEnterprise");
Запрос = Новый HTTPЗапрос(ТекстЗапроса, Заголовки);
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("login", "UserLogin");
СтруктураЗапроса.Вставить("PasswordMd5", "PasswordHash");
СтруктураЗапроса.Вставить("Role", "Admin");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
ТекстJSON = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(ТекстJSON);
Возврат Запрос;
КонецФункции
Далее создадим функцию для инициализации защищенного соединения через HTTPСоединение:
Функция HTTPСоединениеБиллинга()
АдресСервера = "example.ru";
Таймаут = 10;
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС);
Возврат Новый HTTPСоединение(АдресСервера, 444, , , , Таймаут, ЗащищенноеСоединение);
КонецФункции
Разберем процедуру отправки запроса и разбора ответа от веб-сервиса:
Процедура ВыполнитьЗапросКСервису()
Запрос = HTTPЗапросКСервисуБиллинга();
Соединение = HTTPСоединениеБиллинга();
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Исключение
ЗарегистрироватьОшибкуСервиса(ОписаниеОшибки());
Возврат;
КонецПопытки;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния <> 200 Тогда
ЗарегистрироватьОшибкуСервиса("Ошибка сервера: " + Строка(Ответ.КодСостояния));
Возврат;
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
КонецПроцедуры
Текст ошибки сообщает о том, что удаленный узел или промежуточный сетевой шлюз неожиданно разорвал TCP/TLS-соединение во время передачи или ожидания данных (код ошибки 56 библиотеки libcurl). Проанализируем ключевые причины такого поведения:
HTTPПрокси в параметры HTTPСоединение или отключите использование прокси с помощью конструктора Новый HTTPПрокси(Ложь).User-Agent при формировании HTTPЗапрос. Некоторые веб-серверы и защитные экраны (WAF/Nginx) сбрасывают соединение, если данный заголовок отсутствует. Рекомендуется явно добавлять его: Заголовки.Вставить("User-Agent", "1CEnterprise").АдресСервера объекта HTTPСоединение необходимо указывать исключительно имя хоста или IP-адрес (без префикса https:// и без пути /api/...). Указание протокола или пути в адресе сервера нарушает работу SNI при TLS-рукопожатии.usr1cv8). Учетная запись службы может иметь отличные от текущего пользователя параметры прокси-сервера и списка доверенных сертификатов ОС.