Estoy intentando llamar a la API de un Synology NAS para recuperar información sobre el espacio libre y el espacio total disponible.
Mi inicio de sesión funciona y obtengo mi token, las solicitudes con ese token se muestran como "exitosas".
Sin embargo, cuando trato de llamar al método list_share , con el valor additional establecido en volume_status que, según la documentación de la API, debería darme los datos deseados, todo lo que obtengo es:
{ "data": { "offset": 0, "shares": [], "total": 0 }, "success": true }La petición que hago es:
https://NAME:5001/webapi/entry.cgi?api=SYNO.FileStation.List&version=2&method=list_share&additional=volume_status&_sid=TOKEN
¿Estoy haciendo la solicitud incorrecta? ¿Necesito cambiar el método de list_share a list ? ¿Estoy pasando mal el valor additional ?
La documentación que estoy usando se puede encontrar al buscar en Google ' API de descanso de Synology NAS '. Inserté el enlace de descarga directa para el PDF aquí .
De acuerdo con la documentación vinculada, el parámetro adicional necesita corchetes y comillas adicionales como esta:
https://NAME:5001/webapi/entry.cgi?api=SYNO.FileStation.List&version=2&method=list_share&additional=["volume_status"]&_sid=TOKEN
Dependiendo de la biblioteca que use, es posible que deba codificar los corchetes y las comillas, pero la mayoría de las bibliotecas deberían hacerlo por usted :)
Para llegar a esa conclusión, esto es lo que hice:
En la documentación vinculada, encontré la sección sobre list_share y el ejemplo proporcionado:
GET /webapi/entry.cgi?api=SYNO.FileStation.List&version=2&method=list_share& additional=%5B%22real_path%22%2C%22owner%2Ctime%22%5D
Esto es completamente ilegible, ya que la url ya está codificada, pero al abrir la consola del navegador y ejecutar
decodeURIComponent("/webapi/entry.cgi?api=SYNO.FileStation.List&version=2&method=list_share&additional=%5B%22real_path%22%2C%22owner%2Ctime%22%5D")
me lleva a una url legible:
/webapi/entry.cgi?api=SYNO.FileStation.List&version=2&method=list_share&additional=["real_path","owner,time"]
Este es un ejemplo, cómo iniciar sesión, imprimir los datos y cerrar sesión nuevamente:
const http = require("http"); // Helper function to get JSON from an endpoint function getJson(url) { return new Promise((resolve, reject) => { http.get(url, (res) => { res.setEncoding("utf8"); let rawData = ""; res.on("data", (chunk) => { rawData += chunk; }); res.on("end", () => { try { const parsedData = JSON.parse(rawData); resolve(parsedData); } catch (e) { reject(e); } }); }); }); } (async () => { const host = "synology:5000"; const user = "userHere"; const password = "passwordHere"; // login const { data: { sid }, } = await getJson( `http://${host}/webapi/query.cgi?api=SYNO.API.Auth&method=login&version=3&account=${user}&passwd=${password}&session=test&format=sid` ); const url = `http://${host}/webapi/query.cgi?api=SYNO.FileStation.List&method=list_share&version=2&_sid=${sid}&additional=["volume_status"]`; const { data } = await getJson(url); data.shares.forEach((share) => { console.log(share.name, "-", share.path); console.log(share.additional.volume_status); }); //logout await getJson( `http://${host}/webapi/query.cgi?api=SYNO.API.Auth&method=logout&version=3&session=test` ); })();