Áú»¢¶Ä²©

Esta es una traducci¨®n de la p¨¢gina de documentaci¨®n original en espa?ol. Ay¨²danos a mejorarla.

20 API

Descripci¨®n general

La API de Áú»¢¶Ä²© le permite recuperar y modificar mediante programaci¨®n la configuraci¨®n de Áú»¢¶Ä²© y proporciona acceso a datos hist¨®ricos. Es ampliamente utilizada para:

  • crear nuevas aplicaciones para trabajar con Áú»¢¶Ä²©;
  • integrar Áú»¢¶Ä²© en un software de terceros;
  • automatizar tareas rutinarias.

La API de Áú»¢¶Ä²© es una API basada en HTTP y se env¨ªa como parte de la interfaz web. Utiliza el protocolo JSON-RPC 2.0, lo que significa dos cosas:

  • la API consta de un conjunto de m¨¦todos separados;
  • las solicitudes y respuestas entre los clientes y la API se codifican utilizando el formato JSON.

Para obtener m¨¢s informaci¨®n sobre el protocolo y JSON, consulte la [especificaci¨®n JSON-RPC 2.0] (http://www.jsonrpc.org/specification) y la [p¨¢gina de inicio del formato JSON] (http://json.org/).

Para obtener m¨¢s informaci¨®n sobre c¨®mo integrar la funcionalidad de Áú»¢¶Ä²© en sus aplicaciones Python, consulte la biblioteca Python para la API de Áú»¢¶Ä²©.

Estructura

La API consta de una serie de m¨¦todos que se agrupan nominalmente en APIs separadas. Cada uno de los m¨¦todos realiza una tarea espec¨ªfica. Por ejemplo, el m¨¦todo host.create pertenece a la API host y es usado para crear nuevos equipos. Hist¨®ricamente las APIs a veces se denominan "clases".

La gran mayoria de las APIs contienen al menos cuatro m¨¦todos: get, create, update y delete para recuperar, crear, actualizar y borrar datos respectivamente, pero algunas de las APIs pueden proporcionar un conjunto totalmente distinto de m¨¦todos.

Realizando solicitudes

Una vez que haya configurado la interfaz, puede utilizar solicitudes HTTP remotas para llamar a la API. Para hacer eso, debe enviar solicitudes HTTP POST al archivo api_jsonrpc.php ubicado en el directorio de la interfaz. Por ejemplo, si su interfaz de Áú»¢¶Ä²© est¨¢ instalada en https://example.com/zabbix, una solicitud HTTP para llamar al m¨¦todo apiinfo.version puede parecerse a esto:

curl --request POST \
          --url 'https://example.com/zabbix/api_jsonrpc.php' \
          --header 'Content-Type: application/json-rpc' \
          --data '{"jsonrpc":"2.0","method":"apiinfo.version","params":{},"id":1}'

La solicitud debe tener el encabezado Content-Type establecido en uno de estos valores: ²¹±è±ô¾±³¦²¹³¦¾±¨®²Ô/Âá²õ´Ç²Ô-°ù±è³¦, ²¹±è±ô¾±³¦²¹³¦¾±¨®²Ô/Âá²õ´Ç²Ô o ²¹±è±ô¾±³¦²¹³¦¾±¨®²Ô/Âá²õ´Ç²Ôrequest.

El objeto de solicitud contiene las siguientes propiedades:

  • jsonrpc: la versi¨®n del protocolo JSON-RPC utilizada por la API (la API de Áú»¢¶Ä²© implementa JSON-RPC versi¨®n 2.0);
  • method: el m¨¦todo API que se llama;
  • params: los par¨¢metros que se pasar¨¢n al m¨¦todo API;
  • id: un identificador arbitrario de la solicitud.

Si la solicitud es correcta, la respuesta devuelta por la API deber¨ªa parecerse a esto:

{
            "jsonrpc": "2.0",
            "result": "7.0.0",
            "id": 1
       }

El objeto de respuesta, a su vez, contiene las siguientes propiedades:

  • jsonrpc - la versi¨®n del protocolo JSON-RPC;
  • result: los datos devueltos por el m¨¦todo;
  • id: un identificador de la solicitud correspondiente.

Ejemplo de flujo de trabajo

En la siguiente secci¨®n vamos a guiarlo a trav¨¦s de algunos ejemplos con mayor detalle.

´¡³Ü³Ù±ð²Ô³Ù¾±³¦²¹³¦¾±¨®²Ô

Para acceder a cualquier dato en Áú»¢¶Ä²©, necesita:

  • usar un token API existente (creado en la interfaz de Áú»¢¶Ä²© o usando el Token API);
  • utilizar un token de autenticaci¨®n obtenido con el m¨¦todo user.login.

Por ejemplo, si desea obtener un nuevo token de autenticaci¨®n iniciando sesi¨®n como usuario Admin est¨¢ndar, entonces una solicitud JSON se ver¨ªa ²¹²õ¨ª:

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Content-Type: application/json-rpc' \
       --data '{"jsonrpc":"2.0","method":"user.login","params":{"username":"Admin","password":"zabbix"},"id":1}'

Si proporcion¨® las credenciales correctamente, la respuesta devuelta por la API debe contener el token de autenticaci¨®n del usuario:

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

M¨¦todos de autorizaci¨®n

Por encabezado de autorizaci¨®n

Todas las solicitudes de API requieren una autenticaci¨®n o un token de API. Puede proporcionar las credenciales mediante el encabezado de autorizaci¨®n en la solicitud:

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Authorization: Bearer 0424bd59b807674191e7d77572075f33'

Si est¨¢ utilizando Apache, es posible que deba cambiar la configuraci¨®n predeterminada de Apache en /etc/apache2/apache2.conf agregando la siguiente l¨ªnea:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

De lo contrario, Apache podr¨ªa no enviar el encabezado de autorizaci¨®n en la solicitud.

Por propiedad "auth"

La propiedad "auth" puede autorizar una solicitud de API.

Tenga en cuenta que la propiedad "auth" est¨¢ en desuso. Se eliminar¨¢ en futuras versiones.

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Content-Type: application/json-rpc' \
       --data '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid"]},"auth":"0424bd59b807674191e7d77572075f33","id":1}'
Por galleta Áú»¢¶Ä²©

Una cookie "zbx_session" se utiliza para autorizar una solicitud de API desde la interfaz de usuario de Áú»¢¶Ä²© realizada utilizando JavaScript (desde un m¨®dulo o un widget personalizado).

Recuperando equipos

Ahora tiene un token de autenticaci¨®n de usuario v¨¢lido que puede usar para acceder a los datos en Áú»¢¶Ä²©. Por ejemplo, puede utilizar el M¨¦todo host.get para recuperar los ID, nombres de equipo e interfaces de todos los equipos configurados:

Solicitud:

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
       --header 'Content-Type: application/json-rpc' \
       --data @data.json

data.json es un archivo que contiene una consulta JSON. En lugar de un archivo, puede pasar la consulta en el argumento --data.

datos.json

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

El objeto de respuesta contendr¨¢ los datos solicitados sobre los equipos:

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

Por motivos de rendimiento, siempre se recomienda enumerar las propiedades del objeto que desea recuperar. As¨ª, evitar¨¢ recuperarlo todo.

Creando una nueva ³¾¨¦³Ù°ù¾±³¦²¹

Ahora, cree una nueva ³¾¨¦³Ù°ù¾±³¦²¹ en el equipo "Áú»¢¶Ä²© server" usando los datos que ha obtenido del host.get en la solicitud anterior. Esto se puede hacer usando el m¨¦todo item.create:

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
       --header 'Content-Type: application/json-rpc' \
       --data '{"jsonrpc":"2.0","method":"item.create","params":{"name":"Free disk space on /home/joe/","key_":"vfs.fs.size[/home/joe/,free]","hostid":"10084","type":0,"value_type":3,"interfaceid":"1","delay":30},"id":3}'

Una respuesta exitosa contendr¨¢ el ID de la ³¾¨¦³Ù°ù¾±³¦²¹ reci¨¦n creada, que se puede utilizar para hacer referencia a la ³¾¨¦³Ù°ù¾±³¦²¹ en las siguientes solicitudes:

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

El m¨¦todo item.create as¨ª como otros m¨¦todos de creaci¨®n tambi¨¦n pueden aceptar matrices de objetos y crear varios elementos con una ¨²nica llamada a la API.

Creando m¨²ltiples iniciadores

Entonces, si los m¨¦todos de creaci¨®n aceptan matrices, podemos agregar m¨²ltiples iniciadores ²¹²õ¨ª:

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
       --header 'Content-Type: application/json-rpc' \
       --data '{"jsonrpc":"2.0","method":"trigger.create","params":[{"description":"Processor load is too high on {HOST.NAME}","expression":"last(/Linux server/system.cpu.load[percpu,avg1])>5",},{"description":"Too many processes on {HOST.NAME}","expression":"avg(/Linux server/proc.num[],5m)>300",}],"id":4}'

Una respuesta exitosa contendr¨¢ los ID de los iniciadores reci¨¦n creados:

{
       "jsonrpc": "2.0",
       "result": {
       "triggerids": [
       "17369",
       "17370"
       ]
       },
       "id": 4
       }

Actualizando una ³¾¨¦³Ù°ù¾±³¦²¹

Habilite una ³¾¨¦³Ù°ù¾±³¦²¹ estableciendo su estado en "0":

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
       --header 'Content-Type: application/json-rpc' \
       --data '{"jsonrpc":"2.0","method":"item.update","params":{"itemid":"10092","status":0},"id":5}'

La respuesta exitosa contendr¨¢ el ID de la ³¾¨¦³Ù°ù¾±³¦²¹ actualizada:

{
       "jsonrpc": "2.0",
       "result": {
       "itemids": [
       "10092"
       ]
       },
       "id": 5
       }

El m¨¦todo item.update as¨ª como otros m¨¦todos de actualizaci¨®n tambi¨¦n pueden aceptar matrices de objetos y actualizar varias ³¾¨¦³Ù°ù¾±³¦²¹s con una ¨²nica llamada a la API.

Actualizaci¨®n de m¨²ltiples iniciadores

Habilite m¨²ltiples iniciadores estableciendo su estado en "0":

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
       --header 'Content-Type: application/json-rpc' \
       --data '{"jsonrpc":"2.0","method":"trigger.update","params":[{"triggerid":"13938","status":0},{"triggerid":"13939","status":0}],"id":6}'

La respuesta exitosa contendr¨¢ los ID de los iniciadores actualizados:

{
       "jsonrpc": "2.0",
       "result": {
       "triggerids": [
       "13938",
       "13939"
       ]
       },
       "id": 6
       }

Este es el m¨¦todo preferido de actualizaci¨®n. Algunos m¨¦todos API, como host.massupdate, permiten escribir un c¨®digo m¨¢s simple. Sin embargo, no se recomienda utilizar estos m¨¦todos ya que se eliminar¨¢n en versiones futuras.

Manejo de errores

Hasta el momento todo lo que ha probado ha funcionado bien. Pero ?qu¨¦ sucede si intenta realizar una llamada incorrecta a la API? Intentar crear otro equipo llamando a host.create pero omitiendo el par¨¢metro obligatorio de groups:

curl --request POST \
       --url 'https://example.com/zabbix/api_jsonrpc.php' \
       --header 'Authorization: Bearer ${AUTHORIZATION_TOKEN}' \
       --header 'Content-Type: application/json-rpc' \
       --data '{"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":7}'

La respuesta contendr¨¢ entonces un mensaje de error:

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

Si se ha producido un error, en lugar de la propiedad result, el objeto de la respuesta contendr¨¢ la propiedad error con los siguientes datos:

  • code - un c¨®digo de error;
  • message: un breve resumen de errores;
  • data: un mensaje de error m¨¢s detallado.

Los errores pueden ocurrir en varios casos, como por ejemplo, al usar valores de entrada incorrectos, un tiempo excedido de espera de sesi¨®n o intentar acceder a objetos no existentes. Su aplicaci¨®n deber¨ªa poder manejar correctamente este tipo de errores.

Versiones de API

Para simplificar el versionado de API, desde Áú»¢¶Ä²© 2.0.4, la versi¨®n de la API coincide con la versi¨®n misma de Áú»¢¶Ä²© . Puede usar el m¨¦todo apiinfo.version para encontrar la versi¨®n de la API con la que est¨¢ trabajando. Esto puede ser muy ¨²til para ajustar su aplicaci¨®n y usar las funciones especificas de la versi¨®n.

Áú»¢¶Ä²© garantiza la compatibilidad con versiones anteriores en una misma versi¨®n principal. Cuando hacemos cambios incompatibles entre versiones principales, solemos dejar las caracter¨ªsticas anteriores como obsoletas en la nueva versi¨®n, y solo las eliminamos despu¨¦s del lanzamiento de la siguiente versi¨®n. Ocasionalmente podr¨ªamos eliminar funciones entre versiones principales sin proveer compatibilidad. Es importante que nunca conf¨ªe en ninguna funci¨®n obsoleta y actualice cuanto antes a las nuevas alternativas.

Puede seguir todos los cambios de la API en el API changelog.

Otras lecturas

Ahora ya sabe suficiente para empezar a trabajar con las API en Áú»¢¶Ä²©, pero no se detenga aqu¨ª. Para m¨¢s informaci¨®n le sugerimos que eche un vistazo a la lista de API disponibles.