Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Не удаётся выполнить запрос к сайту Graphql.

    Не удаётся выполнить запрос к сайту Graphql.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Не удаётся выполнить запрос к сайту Graphql., RouterOS
     
    saied
    Guest
    #1
    0
    17.04.2024 19:57:00
    Я пытаюсь использовать инструмент /fetch, чтобы запросить данные через GraphQL. Но как ни стараюсь, всегда получаю ошибку синтаксиса. Насколько я понимаю, запрос правильный, потому что он работает в CURL и Postman. Вот сам запрос. Я проверил, URL и токен доступа правильные. Для безопасности я, конечно, заменил URL и токен, но http-данные не трогал. Это просто сам запрос, который я запускаю, и я подозреваю, что где-то не хватает символа экранирования, но не могу понять, где именно:

    :put ([/tool fetch url="https://somewebsite/api/graphql" \
    http-method=post \
    http-header-field="Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiNjdhYjYxOWZiMGFmODZiNDMyNTcyOTI1ODcw­ZGRkZTI1NTJlMGVlNzdkNjM2ZDQxNGQxYjlmOGI3NDNhNWE1MjM3MGYwZWFk­NGVkN2NlNTgiLCJpYXQiOjE3MTMzNzU4MTQuMzcxNiwibmJmIjoxNzEzMzc1­ODE0LjM3MTYsImV4cCI6MjE0NTkxNjgwMC4xMDM3LCJzdWIiOiIxNyIsInNj­b3BlcyI6W119.XjbbSMlBYyioE4f2OLse6v5gDtfZS8SwL2hkI3tXSKZEokfZ-kbv5z4t-0901zY0ckNyXxjvPWRvnaSPTkfQSDEwoCykXE8R6S9oRb8LzZCxb1EsmGaM2­wdpPwKHqqYiBsBD491rzgcWOYPAnOwx5oC7iOAKesrNsBGfRgGe1yOeN6Auz­uZdF7ZicbD50y2XC4NTI69jfYKIQoFh0c1m4mcNWDynSeY6qWavi7RKoN2gz­mNV8OniMIDWzOykh7_HuibosXuJ_l8MHhDQ9Py_85aWhJnZpFwCYhp2--WqMq8mZcX8QR7u54_fd20QsAQZX_DmLggeSSi_gFVhgjKnI1Hf_JcNMSpJyY­pavyux4himsLtegHzcc9xlBTimvYJ0KTrBPi8i9xGe6ShdTwMHyrB68UC050­dOqSm-OxxkzgLMcu2DD1PlLwoA707wIfZNT_usYrNM5ehDNqKwrUMDJ_fueqI9BwSg­euyP07QBmebj6Z99wbIkkASraxjRHDRb1YAkdNZDTNtBIsbWBKJHPXpqmQQx­KF44bCux-yjGQlmY5R270H-Ru8-YbD2DQv8hj08ArqiUB2-QVx-spMoa9uoV3OhXhHor7Ot558l0J9m3ZP7cTZVlXGUjK2Dwfl5XNg1U2Kvyrgo­q57vSTA8wW55kj3dCUD4fq1eIDQgLATI" \
    http-data="{\"query\":\"query accountid {accounts(id:2){entities{name}}}\"}" output=user as-value]->"data")

    А вот что выводит терминал в ответ:

    {"{\"query\":\"query_accountid_{accounts(id:2){entities{name}}}\"}":{"errors":[{"message":"Syntax Error: Unexpected <EOF>"}]}}
     
     
     
    saied
    Guest
    #2
    0
    06.05.2024 18:40:00
    Спасибо за помощь до этого момента. Провожу дополнительные тесты, и появляется следующая информация. Допустим, я получаю такой результат с graphql эндпоинта: {“data”:{“inventory_model_field_data”:{“entities”:[{“id”:“833”}]}}}. После десанитизации у меня получается data=inventory_model_field_data=entities=id=833. Но я хочу преобразовать это в массив, чтобы можно было взять ID, однако, что бы я ни делал, мне никак не удаётся получить этот ID.
     
     
     
    Amm0
    Guest
    #3
    0
    06.05.2024 20:35:00
    Да, именно так RouterOS выводит массив, но при этом можно использовать оператор «->» для работы с массивами. В RouterOS есть «индексы» с числовыми значениями (например, как в JSON — квадратные скобки), а если это «map» с ключами и значениями, то для доступа через оператор массива RouterOS «->» используются кавычки с именем ключа. Так что, если начинать с вашего GQL в виде строки, которую преобразуют через [:deserialize]: # строка здесь, а результаты берутся из ([/tool/fetch ...]->"data") и сохраняются в переменную "myjson":

    :global myjson "{\"data\":{\"inventory_model_field_data\":{\"entities\":[{\"id\":\"833\"}]}}}"

    # в версии V7.13+ :deserialize получает массив RouterOS из переменной $myjson
    :global myarray [:deserialize from=json $myjson]

    # ТЕПЕРЬ... если просто вывести массив, он не выглядит как обычный массив
    :put $myarray
    #data=inventory_model_field_data=entities=id=833
    # То есть, RouterOS так их компактно отображает... Чтобы обратиться к элементу, надо сделать так: :put ($myarray->"data"->"inventory_model_field_data"->"entities"->0)
    # id=833

    :put ($myarray->"data"->"inventory_model_field_data"->"entities"->0->"id")
    # 833

    # Или показать, что внутри GQL это массив — [:len] даст длину, здесь всего 1
    :put [:len ($myarray->"data"->"inventory_model_field_data"->"entities")]
    # 1
     
     
     
    Amm0
    Guest
    #4
    0
    06.05.2024 20:42:00
    Да, вот так RouterOS выводит массив, но можно использовать оператор массива "->". В RouterOS есть "индекс" с числами (например, JSON-скобки), или если это "map" с парами ключ-значение, тогда для доступа используется имя в кавычках с оператором доступа массива "->"...

    Так что, если у вас есть GQL в виде строки, её можно конвертировать с помощью [:deserialize]: # строка здесь, а результаты берутся из ([/tool/fetch ...]->"data") и сохраняются в переменную "myjson"...

    :global myjson "{\"data\":{\"inventory_model_field_data\":{\"entities\":[{\"id\":\"833\"}]}}}"

    # в версии V7.13+ :deserialize берет массив RouterOS из \$myjson  
    :global myarray [:deserialize from=json $myjson]

    # ТЕПЕРЬ... если просто вывести это, оно не будет выглядеть как массив  
    :put $myarray  
    #data=inventory_model_field_data=entities=id=833  
    # то есть, вот как RouterOS их сжимает... Чтобы получить доступ, нужно сделать вот так: :put ($myarray->"data"->"inventory_model_field_data"->"entities"->0)  
    # id=833

    :put ($myarray->"data"->"inventory_model_field_data"->"entities"->0->"id")  
    # 833

    # Или чтобы показать, что внутри GQL это массив, [:len] даст нам количество элементов, здесь оно равно 1
    :put [:len ($myarray->"data"->"inventory_model_field_data"->"entities")]
    # 1

    Примечание: команда fetch в RouterOS тоже возвращает элемент data, так что есть два “data” в разных формах. Например: :global myjson ([/tool/fetch url=… as-value output=user] ->“data”) — и этот data содержит JSON в виде строки, поэтому надо получить элемент data внутри JSON...

    Чтобы показать разницу, вот однострочник:  
    :put ([:deserialize from=json ([/tool/fetch url=… as-value output=user] ->“data”) ]->"data"->"inventory_model_field_data"->"entities"->0->"id")
     
     
     
    saied
    Guest
    #5
    0
    07.05.2024 12:29:00
    Спасибо за это. Я ужасно разбираюсь в программировании, но RouterOS кажется чем-то совершенно иным по сравнению с тем, что я видел раньше (python, JS). Очень благодарен за помощь.
     
     
     
    Amm0
    Guest
    #6
    0
    07.05.2024 13:18:00
    Кстати, операционная команда [:deserialize from=json] – это нововведение, раньше, до появления :deserialize, твоя проблема была бы настоящим кошмаром. Но ладно, это действительно отличается от всего остального.

    Хотя то же самое можно сказать и про поддержку TCL в роутерах Cisco IOS — это было ужасно сложно и ненадёжно, ещё сложнее, чем скрипты RouterOS. Большинство новых роутеров поддерживают контейнеры, похожие на Docker, так что если у тебя уже есть рабочий код на GraphQL где-то ещё… можно попытаться запустить его через /container и таким образом обойтись без скриптов RouterOS.
     
     
     
    saied
    Guest
    #7
    0
    07.05.2024 16:46:00
    Спасибо за это. Да, я новичок в программировании, но, похоже, есть кое-какие баги, особенно в том, как инструмент Fetch работает с GraphQL. Например, я пытался сделать запрос примерно такой:

    :global url “https://web-ipv6test.sonar.rocks/api/graphql”  
    :global testname “testtest123”  
    :global contentType “application/json”  
    :global data "{\"query\":\"query inventory{inventory_model_field_data(general_search:$testname){entities{id}}}\"}"  
    :put ([/tool fetch url=$url http-method=post http-header-field=“Content-Type:application/json, Authorization: $authorization” http-data=$datafile mode=https output=user as-value]->“data”)

    И результат был хороший. Но когда я заменил значение переменной на что-то вроде “01020304”, начали появляться ошибки. Вся эта ситуация с ошибками graphql казалась мне бессмысленной. Я начал экспериментировать, чтобы понять, в чём проблема. Оказалось, что вся загвоздка в том, что если число начинается с нуля, возникает ошибка. Если искать, например, “1020304”, проблем не было вообще.

    Поэтому, видимо, мне придётся идти по пути с использованием docker-контейнера — кажется, это более надёжно и понятнее.
     
     
     
    Amm0
    Guest
    #8
    0
    07.05.2024 17:33:00
    Ведущий 0 в значении $testname? Если да, возможно, стоит брать $testname в кавычки. (Кстати, как уже было сказано, имя переменной выглядит неправильно.) :global data file “{"query":"query inventory{inventory_model_field_data(general_search: " $testname**"**){entities{id}}}"}” Возможно, проблема на стороне GQL бэкенда — он не любит ведущие нули или считает, что это восьмеричное число, не знаю… А тот же самый запрос GraphQL с ведущим 0 работает через CLI или какой-то другой GraphQL-инструмент?
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры