Áú»¢¶Ä²©

18. API

Vis?o Geral

A API do Áú»¢¶Ä²© permite que voc¨º, de forma program¨¢tica, receba e modifica as configura??es do Áú»¢¶Ä²©, al¨¦m de prover acesso a dados hist¨®ricos e das m¨¦dias. Ela pode ser utilizada, por exemplo, para:

  • Criar novas aplica??es para trabalhar com o Áú»¢¶Ä²©;
  • Integrar o Áú»¢¶Ä²© com softwares de terceiros;
  • Automatizar tarefas rotineiras.

A API ¨¦ um servi?o web fornecido em conjunto com a Interface Web do Áú»¢¶Ä²©. Esta API utiliza JSON, em sua vers?o 2, e duas formas de trabalho:

  • A API ¨¦ separada em dois conjuntos de m¨¦todos;
  • As requisi??es e respostas entre os clientes s?o codificadas no formato JSON.

Maiores informa??es sobre o protocolo JSON podem ser obtidas em e na .

Estrutura

A API consiste em uma quantidade de m¨¦todos que s?o nominalmente separados como APIs individuais. Cada um destes m¨¦todos executa uma tarefa espec¨ªfica. Por exemplo, o m¨¦todo host.create pertence ¨¤ API host e ¨¦ utilizada para criar novos hosts. Historicamente as APIs s?o referidas como "classes".

A maioria das APIs possuem quatro m¨¦todos: get, create, update e delete para, respectivamente, recuperar, criar, atualizar e excluir dados, mas algumas das APIs podem possuir m¨¦todos totalmente diferentes.

Executando as requisi??es

Uma vez que voc¨º tenha configurado a interface web do Áú»¢¶Ä²© voc¨º pode utilizar-se de requisi??es HTTP para invocar a API. Para fazer isso voc¨º precisa enviar requisi??es no padr?o HTTP POST para o arquivo api_jsonrpc.php localizado na raiz da interface web. Por exemplo, se sua instala??o do Áú»¢¶Ä²© est¨¢ no endere?o http://company.com/zabbix, a requisi??o HTTP para o m¨¦todo apiinfo.version pode ser algo como a seguir:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
       Content-Type: application/json-rpc

       {"jsonrpc":"2.0","method":"apiinfo.version","id":1,"auth":null,"params":{}}

A requisi??o precisa possuir o cabe?alho com o Content-Type definido com um destes valores : application/json-rpc, application/json ou application/jsonrequest.

Voc¨º pode utilizar qualquer cliente HTTP ou ferramenta de teste JSON-RPC para requisitar os m¨¦todos da API manualmente, mas n¨®s recomendamos o uso de uma das APIs .

Exemplo de fluxo de trabalho

Esta se??o ir¨¢ demonstrar com mais detalhes, atrav¨¦s de exemplos, como trabalhar com a API.

Autentica??o

Antes de voc¨º acessar qualquer dado dentro do Áú»¢¶Ä²© voc¨º precisa se autenticar e obter um token de autentica??o. Isso pode ser feito utilizando o m¨¦todo user.login. Vamos supor que voc¨º queira se autenticar como um usu¨¢rio comum do Áú»¢¶Ä²©. A requisi??o JSON a seguir poderia fazer isso:

{
           "jsonrpc": "2.0",
           "method": "user.login",
           "params": {
               "user": "Admin",
               "password": "zabbix"
           },
           "id": 1,
           "auth": null
       }

Vamos olhar mais de perto o objeto de requisi??o. Ele tem as seguintes propriedades:

  • jsonrpc - a vers?o do protocolo JSON-RPC utilizado pela API; o Áú»¢¶Ä²© implementa a API usando a vers?o 2;
  • method - o m¨¦todo a ser chamado na API;
  • params - os par?metros que ser?o passados para o m¨¦todo da API;
  • id - um identificador arbitr¨¢rio do pedido;
  • auth - um token de autentica??o de usu¨¢rio; uma vez que ainda n?o o temos, deve ser definido como null.

Se voc¨º oferecer as credenciais corretamente ,a resposta retornada pela API ser¨¢ o token de autentica??o:

{
           "jsonrpc": "2.0",
           "result": "0424bd59b807674191e7d77572075f33",
           "id": 1
       }

O objeto de resposta cont¨ºm algumas propriedades:

  • jsonrpc - novamente, a vers?o do protocolo JSON-RPC;
  • result - o dado retornado pelo m¨¦todo;
  • id - identificador da requisi??o corrente.

Recuperando hosts

Agora podemos utilizar o token de autentica??o para acessar dados no Áú»¢¶Ä²©. Por exemplo, vamos utilizar o m¨¦todo host.get para recuperar os IDs, nomes e interfaces de todos os hosts que o usu¨¢rio tiver acesso:

{
           "jsonrpc": "2.0",
           "method": "host.get",
           "params": {
               "output": [
                   "hostid",
                   "host"
               ],
               "selectInterfaces": [
                   "interfaceid",
                   "ip"
               ]
           },
           "id": 2,
           "auth": "0424bd59b807674191e7d77572075f33"
       }

Observe que a propriedade auth agora est¨¢ definida com o token de autentica??o que obtivemos atrav¨¦s do m¨¦todo user.login.

O objeto de resposta ir¨¢ conter o dado sobre os hosts que foi requisitado:

{
           "jsonrpc": "2.0",
           "result": [
               {
                   "hostid": "10084",
                   "host": "Áú»¢¶Ä²© server",
                   "interfaces": [
                       {
                           "interfaceid": "1",
                           "ip": "127.0.0.1"
                       }
                   ]
               }
           ],
           "id": 2
       }

Por quest?es de performance, ¨¦ recomendado sempre solicitar somente as propriedades que voc¨º est¨¢ interessado, n?o solicitar propriedades que voc¨º n?o ir¨¢ utilizar nestes momento.

Criando um novo item

Vamos criar um novo item no "Áú»¢¶Ä²© server" usando os dados que obtivemos atrav¨¦s do m¨¦todo anterior ( host.get). ISso pode ser feito atrav¨¦s do m¨¦todo item.create:

{
           "jsonrpc": "2.0",
           "method": "item.create",
           "params": {
               "name": "Free disk space on $1",
               "key_": "vfs.fs.size[/home/joe/,free]",
               "hostid": "10084",
               "type": 0,
               "value_type": 3,
               "interfaceid": "1",
               "delay": 30
           },
           "auth": "0424bd59b807674191e7d77572075f33",
           "id": 3
       }

Uma resposta bem sucedida ir¨¢ conter o ID do novo item criado, que poder¨¢ ser utilizado mas pr¨®ximas refer¨ºncias:

{
           "jsonrpc": "2.0",
           "result": {
               "itemids": [
                   "24759"
               ]
           },
           "id": 3
       }

O m¨¦todo item.create tamb¨¦m pode ser utilizado m¨²ltiplos itens em uma mesma chamada, atrav¨¦s de arrays de dados.

Gerenciamento de erros

At¨¦ este ponto tudo o que tentamos deve ter funcionado corretamente. Mas o que aconteceria se n¨®s tent¨¢ssemos uma chamada incorreta ¨¤ API? Vamos tentar criar outra chamada ao m¨¦todo host.create, mas omitindo a propriedade obrigat¨®ria groups .

{
           "jsonrpc": "2.0",
           "method": "host.create",
           "params": {
               "host": "Linux server",
               "interfaces": [
                   {
                       "type": 1,
                       "main": 1,
                       "useip": 1,
                       "ip": "192.168.3.1",
                       "dns": "",
                       "port": "10050"
                   }
               ]
           },
           "id": 3,
           "auth": "0424bd59b807674191e7d77572075f33"
       }

A resposta desta requisi??o ir¨¢ conter uma mensagem de erro:

{
           "jsonrpc": "2.0",
           "error": {
               "code": -32602,
               "message": "Invalid params.",
               "data": "No groups for host \"Linux server\"."
           },
           "id": 3
       }

Se um erro ocorrer, ao inv¨¦s da propriedade result, a resposta ir¨¢ conter a propriedade error junto com os dados a seguir:

  • code - um c¨®digo de erro;
  • message - mensagem curta do erro;
  • data - mensagem mais detalhada do erro.

Erros podem ocorrer em diversas situa??es, tal qual, uso incorreto de valores, demora excessiva na sess?o ou tentar acessar objetos inexistentes. Sua aplica??o ter¨¢ que ter a habilidade de tratar corretamente destes erros.

vers?es da API

Para simplificar o versionamento da API, a partir do Áú»¢¶Ä²© 2.0.4, a vers?o da API ¨¦ igual a vers?o do Áú»¢¶Ä²©. Voc¨º pode utilizar o m¨¦todo apiinfo.version para localizar a vers?o da API com a qual voc¨º est¨¢ trabalhando. Este m¨¦todo em particular pode ser muito utilizado para ajustar a sua aplica??o para caracter¨ªsticas espec¨ªficas de cada vers?o da API.

N¨®s garantimos compatibilidade retroativa. Quando ocorrem incompatibilidades entre a vers?o mais nova e a anterior, normalmente n¨®s deixamos a antiga funcionalidade como obsoleta na nova vers?o e a removemos ap¨®s algumas vers?es. Ocasionalmente, n¨®s podemos remover caracter¨ªsticas nas vers?es mais novas sem prover a retrocompatibilidade. Por isso ¨¦ importante que voc¨º n?o mantenha o uso de funcionalidades marcadas como obsoletas, migrando os m¨¦todos para as suas alternativas sempre que poss¨ªvel.

Voc¨º pode seguir todas as mudan?as feitas na API em log de altera??o API.

Outras leituras

Agora voc¨º sabe o suficiente para come?ar a trabalhar com a API do Áú»¢¶Ä²©, mas n?o pare aqui, temos uma extensiva documenta??o sobre os m¨¦todos »å¾±²õ±è´Ç²Ô¨ª±¹±ð¾±²õ.