Как правильно выполнить HTTP запрос из 1С к Zabbix API

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

Интеграция 1С с системами мониторинга, такими как Zabbix, является распространенной задачей при построении отказоустойчивых систем. Одной из самых частых проблем, с которыми сталкиваются разработчики, является получение пустых ответов или ошибок парсинга JSON (например, ошибка 412 или 400) при попытке авторизации через API. В этой статье мы подробно разберем, как правильно настроить HTTPСоединение, сформировать HTTPЗапрос и избежать типичных ошибок с заголовками и кодировками.

Анализ проблемы: почему Zabbix возвращает пустой ответ?

Рассмотрим стандартную ситуацию: нам необходимо вызвать метод user.login для получения токена аутентификации. На первый взгляд код может выглядеть верно, но сервер упорно возвращает пустой результат или ошибку состояния. Проанализируем основные причины неудач:

  1. Неправильный формат заголовков: В 1С при использовании соответствия для заголовков часто допускают ошибку, вставляя двоеточие в имя ключа (например, "Content-Type:" вместо "Content-Type"). Это приводит к тому, что сервер не распознает тип контента.
  2. Проблема BOM (Byte Order Mark): По умолчанию 1С может добавлять невидимый символ BOM в начало строки при записи в UTF-8. Веб-серверы Apache или Nginx, на которых обычно работает Zabbix, воспринимают этот символ как «мусор» перед JSON, что вызывает Parse error.
  3. Метод передачи: Для API Zabbix критически важно использовать метод POST, даже если вы просто запрашиваете данные.

Шаг 1. Настройка HTTP-соединения и формирование заголовков

Разберем, как правильно инициализировать объекты. Вместо передачи заголовков через отдельное соответствие в конструктор запроса, лучше использовать встроенное свойство Заголовки самого объекта HTTPЗапрос. Это позволяет избежать путаницы и делает код более читаемым.

Рассмотрим пример правильной инициализации:


СерверПриемник = "zabbix.yourdomain.ru";
АдресСтраницыНаСервере = "/zabbix/api_jsonrpc.php"; // Убедитесь в правильности пути
Таймаут = 60;

// Инициализируем соединение
HTTP = Новый HTTPСоединение(СерверПриемник, , , , , Таймаут);

// Создаем объект запроса
HTTPЗапрос = Новый HTTPЗапрос(АдресСтраницыНаСервере);

// Устанавливаем заголовок Content-Type правильно
// Zabbix принимает: application/json-rpc, application/json или application/jsonrequest
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");

Шаг 2. Формирование тела запроса и отключение BOM

Для успешного взаимодействия с Zabbix крайне важно передать строку JSON в «чистом» виде. Как мы выяснили, использование BOM часто ломает парсинг на стороне сервера. В методе УстановитьТелоИзСтроки мы должны явно указать параметр ИспользованиеByteOrderMark.НеИспользовать.

Посмотрим на пример формирования JSON-тела для авторизации:


// Формируем структуру запроса (лучше использовать ЗаписьJSON, но здесь для наглядности строка)
СтрокаJSON = "{
|    ""jsonrpc"": ""2.0"",
|    ""method"": ""user.login"",
|    ""params"": {
|        ""user"": ""admin"",
|        ""password"": ""zabbix""
|    },
|    ""id"": 1,
|    ""auth"": null
|}";

// Устанавливаем тело без BOM
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Важный совет: Хотя в примерах часто пишут JSON строкой, в промышленной разработке мы рекомендуем использовать объект 1С Структура и сериализовать её через ЗаписьJSON. Это застрахует вас от ошибок с кавычками, если в пароле пользователя встретятся спецсимволы.

Шаг 3. Отправка запроса и обработка результата

После подготовки запроса используем метод ОтправитьДляОбработки (который соответствует HTTP POST). Мы проанализируем ответ сервера, получив его как строку. Нет необходимости сохранять результат во временный файл, если объем данных невелик.


Попытка
    HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
    
    КодСостояния = HTTPОтвет.КодСостояния;
    СтрокаОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
    
    Если КодСостояния = 200 Тогда
        Сообщить("Запрос выполнен успешно!");
        Сообщить("Ответ сервера: " + СтрокаОтвета);
        // Здесь можно распарсить JSON через ЧтениеJSON и получить токен
    Иначе
        Сообщить("Ошибка сервера! Код состояния: " + КодСостояния);
        Сообщить("Текст ответа: " + СтрокаОтвета);
    КонецЕсли;
Исключение
    Сообщить("Ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
КонецПопытки;

Нюансы работы с HTTPS и версиями Zabbix 5.4+

Проанализируем более современные сценарии. Если ваш Zabbix работает по протоколу HTTPS (что является стандартом безопасности), конструктор HTTPСоединение должен обязательно включать объект ЗащищенноеСоединениеOpenSSL.


Защита = Новый ЗащищенноеСоединениеOpenSSL();
HTTP = Новый HTTPСоединение(СерверПриемник, 443, , , , Таймаут, Защита);

Также стоит учитывать изменения в API. Начиная с Zabbix 5.4, метод передачи токена аутентификации изменился. Если раньше мы передавали параметр auth внутри JSON, то теперь рекомендуется использовать заголовок Authorization.

Рассмотрим, как добавить токен в заголовки для всех последующих запросов после авторизации:


// Полученный ранее токен
ТокенДоступа = "0424bd59b807674191e7d77572075f33"; 

// Для новых версий Zabbix (5.4+)
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);

// Или через специальный заголовок Zabbix
HTTPЗапрос.Заголовки.Вставить("X-Zabbix-Auth", ТокенДоступа);

Резюме: контрольный список для проверки

Если ваш запрос из 1С в Zabbix все еще не работает, проверьте следующие пункты:

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

← На главную