Ad Widget

Collapse

Zabbix API JSON и типы

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • McLeod095
    Member
    • Mar 2010
    • 40

    #1

    Zabbix API JSON и типы

    Добрый день!
    Решил поиграться с Zabbix API с немного другой стороны, немного ковыряю golang и подумал что некоторые скрипты автоматизации хорошо бы переписать php на golang. Обнаружил что библиотеки которые есть не совсем меня устраивают. Начал копать дальше и вот во что уткнулся.
    Вроде как в документации на API есть описание всех структур и тп, и даже в описании есть тип который должен быть у элемента, но в итоге если сделать тот же curl и посмотреть вывод, то становится печально.
    Code:
    {"jsonrpc":"2.0","result":[{"screenid":"180","name":"OpenMQ: 192.168.37.3:7676","hsize":"2","vsize":"123","templateid":"0","screenitems":[{"screenitemid":"29732","screenid":"180","resourcetype":"0","resourceid":"11420","width":"500","height":"100","x":"0","y":"0","colspan":"1","rowspan":"1","elements":"0","valign":"0","halign":"0","style":"0","url":"","dynamic":"1","sort_triggers":"0","application":"","max_columns":"3"}]}],"id":2}
    В документации указано то hsize и vsize являются значениями типа Int, но даже в json видно что это строка. Для интерпретируемых языков это не является проблемой. Но вот для строготипизированных это есть проблема.
    Это является фишкой Zabbix API или багом?
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2
    Originally posted by McLeod095
    Вроде как в документации на API есть описание всех структур и тп, и даже в описании есть тип который должен быть у элемента, но в итоге если сделать тот же curl и посмотреть вывод, то становится печально.
    ...
    В документации указано то hsize и vsize являются значениями типа Int, но даже в json видно что это строка.
    Это является фишкой Zabbix API или багом?
    Равновероятно. Ответ могут дать только исходники на php. Но, хочу отметить, что понятие JSON для Zabbix весьма условно. Тут уже была тема, но про входящий JSON. В рамках ее я покопался в исходных кодах и выяснил, что имеется отдельный валидатор и отдельный интерпретатор. Валидатор всё проверяет по стандарту, а вот интерпретатор понимает только массивы/объекты/строки/числа/null. True/False вообще игнорирует, например, числа тоже не всех стандартизованных типов конвертируются...

    Так что не исключено, что для исходящих JSON есть какое-то усечение по типам. Хотя, конечно, больше похоже на ошибку в какой-то подфункции/выборке, так id всё-таки отдается без кавычек в вашем примере.

    Comment

    • RussianFox
      Senior Member
      • Nov 2014
      • 189

      #3
      Originally posted by McLeod095
      В документации указано то hsize и vsize являются значениями типа Int, но даже в json видно что это строка.
      Как бы, сам json - это строка. И даже если там число написано без ковычек - это все-равно строка. Тип в документации указан для преобразования.


      Originally posted by sadman
      так id всё-таки отдается без кавычек в вашем примере
      этот id задается при запросе самим пользователем.

      Comment

      • sadman
        Senior Member
        • Dec 2010
        • 1611

        #4
        С этим невозможно согласиться в силу того, что:

        Zabbix API является API на основе веб и поставляется как часть веб-интерфейса. Он использует протокол JSON-RPC 2.0, что имеет два значения:
        • API состоит из набора отдельных методов;
        • Запросы и ответы между клиентами и API закодированы с использованием формата JSON.

        Более подробную информацию о протоколе и JSON можно найти на странице спецификации JSON-RPC 2.0 и домашней страницы JSON.
        Ни спецификация JSON в целом, ни спецификация JSON-RPC 2.0 в частности не содержит указания на то, что элементы формата - сплошь строки (хотя, конечно, в философском смысле - это так). Напротив - в нем специально выделены строки и числа как отдельные сущности формата: http://json.org/

        Этот вывод подтверждают и примеры из документации Zabbix (раздел 17. API), где числа оформлены в виде незакавыченных числовых цепочек, а строки - в виде последовательностей символов, заключенных в двойные кавычки.

        Comment

        • sadman
          Senior Member
          • Dec 2010
          • 1611

          #5
          Originally posted by McLeod095
          В документации указано то hsize и vsize являются значениями типа Int, но даже в json видно что это строка. Для интерпретируемых языков это не является проблемой. Но вот для строготипизированных это есть проблема.
          Это является фишкой Zabbix API или багом?
          Насколько я понял, всё проистекает отсюда (Zabbix v2.4):
          Code:
          function DBfetch($cursor, $convertNulls = true) {
          ...
                          case ZBX_DB_POSTGRESQL:
                                  if (!$result = [B]pg_fetch_assoc[/B]($cursor)) {
          ...
          pg_fetch_assoc

          Возвращаемые значения

          Ассоциативный массив, индексированный именами полей выборки. Значения массива представляются в виде текстовых строк. Значения NULL базы данных преобразуются в PHP NULL.
          Так что можно данное поведение отнести к особенности Zabbix в реализации JSON, которую можно считать некорректной или же ошибочной.

          Comment

          Working...