Как протестировать метод HTTP-сервиса 1С с POST-запросом и передачей JSON?

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

При разработке интеграций на платформе 1С часто возникает задача быстрой проверки работы созданного HTTP-сервиса. Разработчики нередко пытаются отправить тестовый POST-запрос прямо из браузера, используя самодельную HTML-форму в адресной строке через схему data:text/html. Однако при попытке прочитать тело запроса в 1С с помощью метода Запрос.ПолучитьТелоКакСтроку() вместо чистого JSON часто получается строка вида a=%7B+++++%22GUID%22...%7D.

В этой статье мы подробно разберем, почему возникает такое искажение данных, как скорректировать отправку через браузер и какие инструменты позволяют полноценно тестировать HTTP-сервисы 1С с передачей JSON.

Почему браузер искажает тело запроса при отправке через форму?

Проанализируем механизм работы тега form в браузере. По умолчанию HTML-форма использует тип кодирования application/x-www-form-urlencoded. Это означает следующее:

  1. Браузер формирует тело запроса по принципу пар «ключ=значение», добавляя имя поля ввода (например, a=).
  2. Все специальные символы и пробелы заменяются процентным кодированием (URL-encode): пробелы становятся знаками +, фигурные скобки превращаются в %7B и %7D, а кавычки — в %22.
  3. Элемент form спецификации HTML не поддерживает отправку с заголовком Content-Type: application/json.

В результате в точку входа метода 1С поступает не сырой JSON, а закодированная строка веб-формы, которую стандартная функция ПрочитатьJSON() обработать не сможет.

Решение 1. Использование атрибута enctype="text/plain" в форме браузера

Если нам критически важно выполнить проверку через простую HTML-форму без специализированных утилит, выясним, как обойти жесткое URL-кодирование. Для этого в теге формы необходимо явно переопределить способ упаковки содержимого с помощью атрибута enctype.

Укажем тип text/plain в строке формы:


data:text/html,<form action="http://192.168.0.96/hilgroup/hs/tcd-http/getMovingRegisters" method="post" enctype="text/plain"><input name="a"><input type="submit" value="Отправить"></form>

В этом случае браузер передает текст без преобразования спецсимволов в последовательности %XX. Однако обратите внимание: перед переданным JSON все равно сохранится префикс имени поля a=, который потребуется отсекать на стороне 1С перед разбором структуры. Поэтому использование форм для REST-сервисов является лишь временным обходным путем.

Решение 2. Тестирование запроса через консоль разработчика браузера

Гораздо более точным способом проверки из браузера является запуск нативного JavaScript через консоль инструментов разработчика (клавиша F12). Рассмотрим, как составить вызов с помощью стандартной функции fetch:


fetch('http://192.168.0.96/hilgroup/hs/tcd-http/getMovingRegisters', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json; charset=utf-8'
    },
    body: JSON.stringify({
        "GUID": "c310475f-58ab-11e7-80da-6abab6d48e3b"
    })
})
.then(response => response.text())
.then(data => console.log(data))
.catch(error => console.error(error));

Важный нюанс: при отправке запроса из консоли браузера на другой домен или порт вступает в действие механизм CORS. Браузер предварительно отправляет preflight-запрос методом OPTIONS. Если в вашем HTTP-сервисе 1С не настроена обработка метода OPTIONS и не передаются заголовки Access-Control-Allow-Origin, браузер заблокирует чтение ответа.

Решение 3. Отправка POST-запроса средствами платформы 1С:Предприятие

Самым надежным способом тестирования в рамках экосистемы 1С является написание небольшой внешней обработки или тестового скрипта. Для этого задействуются объекты HTTPСоединение и HTTPЗапрос. Разберем по шагам реализацию отправки:

  1. Сформируем заголовки запроса и укажем тип содержимого application/json; charset=utf-8.
  2. Создадим объект HTTPЗапрос, указав относительный путь метода сервиса, и поместим в него строку JSON с помощью метода УстановитьТелоИзСтроки().
  3. Инициализируем HTTPСоединение с указанием адреса сервера, порта и данных авторизации.
  4. Выполним метод ОтправитьДляОбработки() для отправки данных методом POST.

Посмотрим на пример кода на встроенном языке 1С:


СтрокаJSON = "{""GUID"": ""c310475f-58ab-11e7-80da-6abab6d48e3b""}";

Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");

HTTPЗапрос = Новый HTTPЗапрос("/hilgroup/hs/tcd-http/getMovingRegisters", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

HTTPСоединение = Новый HTTPСоединение("192.168.0.96", , "Пользователь1С", "Пароль1С");
Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

КодСостояния = Ответ.КодСостояния;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();

Решение 4. Отправка через консольную утилиту cURL

Для быстрой проверки сервиса без запуска графического клиента 1С или браузера удобно применять утилиту cURL. Она исключает проблемы с политиками CORS и позволяет точно передать заголовки и тело:


curl -X POST "http://192.168.0.96/hilgroup/hs/tcd-http/getMovingRegisters" \
     -H "Content-Type: application/json; charset=utf-8" \
     -u "Пользователь1С:Пароль1С" \
     -d "{\"GUID\": \"c310475f-58ab-11e7-80da-6abab6d48e3b\"}"

Как правильно принимать JSON внутри метода HTTP-сервиса 1С

Рассмотрим подробнее обработку входящего запроса внутри модуля HTTP-сервиса. Для небольших пакетов данных допустимо использовать прямое чтение строки:


СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Если же через сервис передаются объёмные массивы данных, загрузка всего содержимого в одну строку создаёт повышенную нагрузку на оперативную память рабочего процесса. В таких случаях эффективнее читать входящие данные напрямую через поток:


Поток = Запрос.ПолучитьТелоКакПоток();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Поток);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Итог: HTML-формы браузера непригодны для полноценного тестирования JSON API из-за специфики протокола кодирования данных. Для проверки HTTP-сервисов 1С рекомендуется использовать штатные объекты HTTPСоединение, консоль браузера с вызовом fetch или консольную утилиту cURL.

← На главную