При разработке и отладке собственных HTTP-сервисов в платформе 1С часто возникает необходимость протестировать передачу данных в теле запроса (методы POST, PUT, PATCH). Стандартная проверка через адресную строку браузера позволяет отправлять только простые GET-запросы без тела. Использование общедоступных онлайн-сервисов тестирования API также не подходит, поскольку они не имеют прямого доступа к локальному компьютеру разработчика (localhost или 127.0.0.1).
Разберем по шагам, какими инструментами можно отправлять тестовые запросы с телом на локальный веб-сервер и как правильно принимать и десериализовать полученный JSON на стороне HTTP-сервиса 1С.
Рассмотрим основные и наиболее удобные способы отправки HTTP-запросов с телом на локальный адрес:
Content-Type: application/json), указывать авторизацию (Basic Auth) и передавать тело запроса в формате raw JSON, form-data или binary. Поскольку приложение запускается локально на рабочей станции, оно без проблем обращается к localhost и локальным портам веб-сервера.HTTPСоединение и метод ОтправитьДляОбработки() объекта HTTPЗапрос.Проанализируем программную обработку входящего запроса. В обработчике метода HTTP-сервиса (например, при обработке метода POST) входящие данные передаются в параметре Запрос, который имеет тип HTTPСервисЗапрос.
Для чтения текстового содержимого (например, JSON) используется метод ПолучитьТелоКакСтроку(). Для разбора полученной строки нет необходимости создавать временные файлы на диске — десериализация выполняется напрямую в памяти.
Посмотрим на пример обработчика метода HTTP-сервиса:
Функция getorderPOST(Запрос)
// Получаем тело входящего запроса в виде строки
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
Если ПустаяСтрока(СтрокаJSON) Тогда
Ответ = Новый HTTPСервисОтвет(400);
Ответ.УстановитьТелоДляОбработки("Пустое тело запроса");
Возврат Ответ;
КонецЕсли;
// Инициализируем чтение JSON из полученной строки
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Попытка
ДанныеЗапроса = ПрочитатьJSON(ЧтениеJSON);
Исключение
ЧтениеJSON.Закрыть();
Ответ = Новый HTTPСервисОтвет(400);
Ответ.УстановитьТелоДляОбработки("Ошибка разбора JSON: " + ОписаниеОшибки());
Возврат Ответ;
КонецПопытки;
ЧтениеJSON.Закрыть();
// Выполняем обработку полученных данных (массив структур или структура)
// Например, обходим массив переданных позиций заказа
Если ТипЗнч(ДанныеЗапроса) = Тип("Массив") Тогда
Для Каждого Элемент Из ДанныеЗапроса Цикл
Если ТипЗнч(Элемент) = Тип("Структура") Тогда
Идентификатор = Элемент.id;
Количество = Элемент.quantity;
// Логика записи или создания документов
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Формируем успешный ответ
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоДляОбработки("{""status"": ""ok""}");
Возврат Ответ;
КонецФункции
Если на HTTP-сервис передаются пакеты данных большого размера, загрузка всей строки в память через ПолучитьТелоКакСтроку() может приводить к повышенному потреблению ресурсов сервера. В таких ситуациях рекомендуется использовать потоковое чтение.
Рассмотрим реализацию через потоки:
Функция ОбработатьБольшойЗапрос(Запрос)
ПотокТела = Запрос.ПолучитьТелоКакПоток();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(ПотокТела);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
ПотокТела.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Возврат Ответ;
КонецФункции
При тестировании запросов к локальному сервису необходимо учитывать следующие нюансы:
Content-Type: application/json; charset=utf-8. Это гарантирует корректное распознавание кириллических символов.405 Method Not Allowed до того, как управление будет передано коду 1С.