При разработке интеграций с внешними веб-сервисами, особенно платежными системами, часто возникает задача передачи специфических параметров в заголовках HTTP-запроса. Одной из таких задач является передача текущей даты. Рассмотрим, почему попытка установки стандартного заголовка Date через HTTPЗапрос в 1С часто заканчивается неудачей, и как правильно решить эту задачу.
Многие разработчики сталкиваются с тем, что при попытке добавить Заголовки.Вставить("Date", ТекущаяДата()), сервер на той стороне упорно возвращает или игнорирует переданное значение, подставляя свое. Это происходит не из-за ошибки в коде 1С, а из-за фундаментальных правил протокола HTTP.
Заголовок Date является зарезервированным (служебным). Согласно стандартам RFC, этот заголовок должен генерироваться самим отправителем (сервером или клиентом) непосредственно в момент формирования сообщения. Веб-серверы, такие как Apache или IIS, считают этот заголовок своим «владением» и принудительно перезаписывают его, чтобы соответствовать стандарту времени GMT. Попытка изменить его вручную рассматривается как нарушение протокола, поэтому любое стороннее значение просто отбрасывается.
Если спецификация принимающего сервиса требует передачи временной метки, необходимо отойти от попыток манипуляции стандартным заголовком Date и воспользоваться одним из проверенных архитектурных подходов.
Date используйте название с префиксом X-. Например: X-Custom-Date или X-Request-Timestamp.Предположим, вы хотите передать время своим кастомным заголовком. Рассмотрим, как это сделать в коде 1С:
Для начала сформируем строку даты в правильном формате (например, ISO 8601), так как это стандарт для большинства API:
// Формируем дату в формате UTC
ТекущаяДатаUTC = ТекущаяДата();
ДатаДляЗаголовка = Формат(ТекущаяДатаUTC, "ДФ=yyyy-MM-ddTHH:mm:ssK");
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json;charset=UTF-8");
// Вместо стандартного Date используем свой
Заголовки.Вставить("X-Custom-Date", ДатаДляЗаголовка);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
Если же вы решили передать данные в теле запроса, убедитесь, что структура JSON соответствует требованиям принимающей стороны. Нередко ошибки типа Data at the root level is invalid возникают не из-за заголовков, а из-за того, что сервер не может корректно прочитать структуру JSON, переданную в теле.
Проанализируем типичную ошибку Data at the root level is invalid. Если вы видите такое сообщение при обращении к веб-сервису, это означает, что проблема лежит на уровне содержимого сообщения (Payload), а не заголовков. Внимание: это сообщение касается именно структуры данных (Data), а не даты (Date). Проверьте следующие пункты:
JSON?JSON-объекта?UTF-8)?В заключение отметим: не пытайтесь настраивать конфигурационные файлы веб-серверов (например, php.ini) для решения этой задачи. Это не поможет «обмануть» протокол HTTP. Лучшим решением всегда будет следование документации API, использующей кастомные заголовки или поля в теле запроса для передачи служебной информации.