| 
    
        
     
     | 
    
  | 
Передача параметра в 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.     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |