Как передать тело HTTP-запроса на локальный сервис 1С и обработать входящие данные?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке и отладке собственных HTTP-сервисов в платформе 1С часто возникает необходимость протестировать передачу данных в теле запроса (методы POST, PUT, PATCH). Стандартная проверка через адресную строку браузера позволяет отправлять только простые GET-запросы без тела. Использование общедоступных онлайн-сервисов тестирования API также не подходит, поскольку они не имеют прямого доступа к локальному компьютеру разработчика (localhost или 127.0.0.1).

Разберем по шагам, какими инструментами можно отправлять тестовые запросы с телом на локальный веб-сервер и как правильно принимать и десериализовать полученный JSON на стороне HTTP-сервиса 1С.

Инструменты для отправки тела запроса на локальный сервис

Рассмотрим основные и наиболее удобные способы отправки HTTP-запросов с телом на локальный адрес:

  1. Postman. Специализированное приложение для тестирования API. Позволяет отправлять любые типы запросов (GET, POST, PUT, DELETE), настраивать заголовки (например, Content-Type: application/json), указывать авторизацию (Basic Auth) и передавать тело запроса в формате raw JSON, form-data или binary. Поскольку приложение запускается локально на рабочей станции, оно без проблем обращается к localhost и локальным портам веб-сервера.
  2. Консольная утилита cURL. Доступна в большинстве операционных систем. Позволяет выполнить быструю отправку данных одной командой из терминала с явным указанием заголовков, параметров авторизации и самого тела запроса.
  3. Встроенные средства 1С. Для эмуляции запросов из другой базы или внешней системы можно использовать объект HTTPСоединение и метод ОтправитьДляОбработки() объекта HTTPЗапрос.

Прием и разбор тела запроса в методе HTTP-сервиса 1С

Проанализируем программную обработку входящего запроса. В обработчике метода 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);
    Возврат Ответ;

КонецФункции

Важные особенности настройки окружения

При тестировании запросов к локальному сервису необходимо учитывать следующие нюансы:

  1. Кодировка и заголовки. При отправке запроса из сторонних клиентов всегда следует указывать заголовок Content-Type: application/json; charset=utf-8. Это гарантирует корректное распознавание кириллических символов.
  2. Авторизация. HTTP-сервисы 1С требуют аутентификации пользователя базы. При отправке запроса из Postman или cURL необходимо передавать учетные данные через Basic Auth (логин и пароль пользователя 1С с правами на вызов сервиса).
  3. Настройки веб-сервера. Модуль расширения веб-сервера (Apache или IIS) должен разрешать обработку соответствующих методов (POST, PUT). При блокировке метода на уровне веб-сервера запрос вернет код ошибки 405 Method Not Allowed до того, как управление будет передано коду 1С.
← На главную