Имя: Пароль:
1C
1С v8
Передача параметра в JSON-запрос
,
0 lonely_ferret
 
13.09.23
15:43
Здравствуйте. Подскажите, как записать переменную в json-запрос? Я вычисляю код аутентификации в отдельной функции, затем передаю ее в запрос, но у меня возникает ошибка {"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error","data":"Invalid JSON. An error occurred on the server while parsing the JSON text."},"id":null}. Код исполняемой процедуры привожу ниже.
    
Аутентификация = Аутентификация(ПК, Доступ);
    
Аид = Лев(Прав(Аутентификация, 41), 32);
    
HTTPСоединение = Новый HTTPСоединение("zabbix.spbstu.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL);
СтрокаJSON = "{
                |    ""jsonrpc"":""2.0"",
                |    ""method"":""host.get"",
                |    ""params"":{
        |        ""output"": [""hostid"", ""host""],
        |        ""selectInterfaces"": [
        |                    ""interfaceid"", ""ip""
        |                ]
        |            }
        |    },
        |  ""id"": 2,
        |  ""auth"": Аид
        | }";
                                
HTTPЗапрос = Новый HTTPЗапрос("/api_jsonrpc.php");     
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json-rpc; charset=utf-8");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = HTTPСоединение.Получить(HTTPЗапрос);
Тело = Ответ.ПолучитьТелоКакСтроку();
1 Галахад
 
гуру
13.09.23
15:46
Скобочка лишняя.
2 Tatitutu
 
13.09.23
15:47
Сегодня 13.09.23 День Программиста

"А"+"В"="АВ";
3 azernot
 
13.09.23
15:50
(0) Предположительно, надо удалить 9-ю строку СтрокаJSON:

       |            }
4 Tatitutu
 
13.09.23
15:55
jSON !!!

СтрокаJSON - не правильно сформирована

СтрокаJSON = "{
                |    ""jsonrpc"":""2.0"",
                |    ""method"":""host.get"",
                |    ""params"":{
        |        ""output"": [""hostid"", ""host""],
        |        ""selectInterfaces"": [
        |                    ""interfaceid"", ""ip""
        |                ]
        |            }
        |    },
        |  ""id"": 2,
        |  ""auth"": "+Аид+"
        | }";


АИД передается как текст в РУССКОЙ РАССКЛАДКЕ , а не как ЗНАЧЕНИЕ
5 lonely_ferret
 
13.09.23
15:58
(4) Боже, да, это же строка... Спасибо
6 lonely_ferret
 
13.09.23
16:04
Убрала лишнюю скобку и поправила строку. Ошибка осталась та же. В чем может быть проблема? Извините, пожалуйста, не ругайтесь, я ранее с данной технологией не работала, а документация Zabbix API не очень помогла.
7 Галахад
 
гуру
13.09.23
16:11
Валидность можно проверить например тут: https://jsonlint.com/
8 azernot
 
13.09.23
16:13
(6) >Ошибка осталась та же
Прям та же? А может всё же что-то в ней поменялось? Если та же, то вы запускаете старый вариант
9 azernot
 
13.09.23
16:15
Сделайте

Сообщить(СтрокаJSON)

перед вызовом
Ответ = HTTPСоединение.Получить(HTTPЗапрос);

И проверьте валидатором свой JSON
10 azernot
 
13.09.23
16:17
Да, и ещё
Если Аид - строка, то надо в кавычки её
""auth"": """+Аид+"""
11 lonely_ferret
 
13.09.23
16:19
(10) Да, ошибка была в этом. Спасибо большое!
12 lonely_ferret
 
13.09.23
16:19
Всем большое спасибо за помощь!
13 НафНаф
 
13.09.23
16:45
(12) не надо JSON собирать ручками, есть же методы в 1С для этого. Соберите в структуру или соответствие и сделайте примерно такое:

Функция СтрокаИзОбъекта(Объект) Экспорт
    
    ЗаписьJSON = Новый ЗаписьJSON;    
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON,Объект);
    Возврат ЗаписьJSON.Закрыть();
    
КонецФункции
14 Staffa
 
13.09.23
16:58
(0) Еще вариант с сериализацией в JSON. Мне, например, так намного комфортнее читать и модифицировать подобные запросы. Сериализатор сам расставит все кавычки и скобки правильно.
МассивХостов = Новый Массив;
МассивХостов.Добавить("hostid");
МассивХостов.Добавить("host");

МассивИнтерфейсов = Новый Массив;
МассивИнтерфейсов.Добавить(Новый Структура("interfaceid", "ip"));

СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("output", МассивХостов);
СтруктураПараметров.Вставить("selectInterfaces", МассивИнтерфейсов);

СтруктураJSON = Новый Структура;
СтруктураJSON.Вставить("jsonrpc", "2.0");
СтруктураJSON.Вставить("method", "host.get");
СтруктураJSON.Вставить("params", СтруктураПараметров);
СтруктураJSON.Вставить("id", 2);
СтруктураJSON.Вставить("auth", Аид);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, СтруктураJSON);

СтрокаJSON = Запись.Закрыть();
15 lubitelxml
 
13.09.23
17:09
(14) возьму на заметку, обычно маленькие пиши через ЗаписатьНачалоОбъекта() ЗаписатьНачалоМассива(). Но в основном приходится ТЗ передавать, тут использую давно написанную функцию, которая через описанные мной методы раскладывает тз в json.
Независимо от того, куда вы едете — это в гору и против ветра!