Интеграция с современными REST API — задача стандартная для разработчика 1С, однако она часто сопровождается неочевидными нюансами работы платформы с кодировками. Рассмотрим ситуацию, когда при отправке сообщения в IntellectDialog через HTTPЗапрос сервер возвращает ошибку 400 Bad Request, а валидация на стороне API утверждает, что все обязательные поля пустые, несмотря на наличие данных в строке запроса.
Когда вы формируете JSON-строку для отправки, вы ожидаете, что сервис получит «чистый» набор байтов в формате UTF-8. Однако стандартный метод УстановитьТелоИзСтроки() в 1С при определенных настройках может добавлять в начало строки так называемую BOM (Byte Order Mark) — специальную невидимую последовательность байтов, указывающую на кодировку UTF-8.
Многие API, включая IntellectDialog, строго следуют спецификации JSON. Наличие BOM-метки приводит к тому, что парсер сервера воспринимает тело запроса как поврежденное или содержащее мусорные данные, из-за чего поля phone, text и provider_id не могут быть корректно распознаны. В результате вы получаете ошибку, в которой сервис сообщает, что обязательные параметры отсутствуют.
Чтобы избежать этой ошибки, нам необходимо принудительно указать платформе 1С, что BOM-метка не должна добавляться в тело запроса. Разберем, как это сделать программно.
Ранее вы использовали стандартный вызов метода:
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса);
Чтобы решить проблему, нам нужно расширить этот вызов, передав параметры кодировки и указав, что использование ByteOrderMark должно быть отключено. Рассмотрим исправленный вариант кода:
// Формируем запрос и указываем параметры кодирования
HTTPЗапрос.УстановитьТелоИзСтроки(
ТекстЗапроса,
"UTF-8",
ИспользованиеByteOrderMark.НеИспользовать
);
Давайте систематизируем процесс отправки сообщения, чтобы избежать ошибок типизации и авторизации:
provider_id должен быть строкой, а не числом.ЗаписатьJSON() для формирования корректного JSON. Проверьте, чтобы итоговая строка не имела лишних пробелов или спецсимволов.Authorization заполнен актуальным ключом API, полученным в личном кабинете организации.Content-Type: application/json. Без этого заголовка сервер может не понять, в каком формате приходят данные.ОтправитьДляОбработки() объекта HTTPСоединение, предварительно настроив ЗащищенноеСоединениеOpenSSL.Если после внесения изменений ошибка сохраняется, выполните следующие действия:
Fiddler или Charles, помогут увидеть «сырой» запрос (Raw Request). Вы сможете сравнить байты, которые отправляет 1С, с теми, что успешно проходят из документации API.Соответствие для заголовков должно быть заполнено точно так, как того требует API. Любая опечатка в ключе заголовка приведет к ошибке 401 или 400.IntellectDialog посмотреть лог пришедшего от вас запроса. Они смогут подсказать, почему именно их парсер «спотыкается» о ваш JSON.Применяя указанные выше настройки метода УстановитьТелоИзСтроки, вы исключите добавление BOM-метки, и ваш запрос успешно пройдет валидацию на стороне сервера. Это классическая проблема при работе с внешними API, которая легко решается при правильной настройке параметров кодирования.