При разработке интеграций на платформе 1С часто возникает задача быстрой проверки работы созданного HTTP-сервиса. Разработчики нередко пытаются отправить тестовый POST-запрос прямо из браузера, используя самодельную HTML-форму в адресной строке через схему data:text/html. Однако при попытке прочитать тело запроса в 1С с помощью метода Запрос.ПолучитьТелоКакСтроку() вместо чистого JSON часто получается строка вида a=%7B+++++%22GUID%22...%7D.
В этой статье мы подробно разберем, почему возникает такое искажение данных, как скорректировать отправку через браузер и какие инструменты позволяют полноценно тестировать HTTP-сервисы 1С с передачей JSON.
Проанализируем механизм работы тега form в браузере. По умолчанию HTML-форма использует тип кодирования application/x-www-form-urlencoded. Это означает следующее:
a=).+, фигурные скобки превращаются в %7B и %7D, а кавычки — в %22.form спецификации HTML не поддерживает отправку с заголовком Content-Type: application/json.В результате в точку входа метода 1С поступает не сырой JSON, а закодированная строка веб-формы, которую стандартная функция ПрочитатьJSON() обработать не сможет.
Если нам критически важно выполнить проверку через простую 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-сервисов является лишь временным обходным путем.
Гораздо более точным способом проверки из браузера является запуск нативного 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, браузер заблокирует чтение ответа.
Самым надежным способом тестирования в рамках экосистемы 1С является написание небольшой внешней обработки или тестового скрипта. Для этого задействуются объекты HTTPСоединение и HTTPЗапрос. Разберем по шагам реализацию отправки:
application/json; charset=utf-8.HTTPЗапрос, указав относительный путь метода сервиса, и поместим в него строку JSON с помощью метода УстановитьТелоИзСтроки().HTTPСоединение с указанием адреса сервера, порта и данных авторизации.ОтправитьДляОбработки() для отправки данных методом 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Запрос);
КодСостояния = Ответ.КодСостояния;
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
Для быстрой проверки сервиса без запуска графического клиента 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\"}"
Рассмотрим подробнее обработку входящего запроса внутри модуля HTTP-сервиса. Для небольших пакетов данных допустимо использовать прямое чтение строки:
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если же через сервис передаются объёмные массивы данных, загрузка всего содержимого в одну строку создаёт повышенную нагрузку на оперативную память рабочего процесса. В таких случаях эффективнее читать входящие данные напрямую через поток:
Поток = Запрос.ПолучитьТелоКакПоток();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Поток);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Итог: HTML-формы браузера непригодны для полноценного тестирования JSON API из-за специфики протокола кодирования данных. Для проверки HTTP-сервисов 1С рекомендуется использовать штатные объекты HTTPСоединение, консоль браузера с вызовом fetch или консольную утилиту cURL.