#javascript #node.js #synology
Вопрос:
Я пытаюсь вызвать API Synology NAS для получения информации о свободном пространстве и общем доступном пространстве.
Мой логин работает, и я получаю свой токен, запросы с этим токеном отображаются как «успешные».
Однако, когда я пытаюсь вызвать list_share
метод с additional
установленным значением volume_status
, которое в соответствии с документацией API должно предоставить мне нужные данные, все, что я получаю, это:
{
"data": {
"offset": 0,
"shares": [],
"total": 0
},
"success": true
}
Запрос, который я делаю, является:
https://NAME:5001/webapi/entry.cgi?api=SYNO.FileStation.Listamp;version=2amp;method=list_shareamp;additional=volume_statusamp;_sid=TOKEN
Я делаю неправильный запрос? Нужно ли мне менять метод с list_share
на list
? Я неправильно передаю additional
значение?
Документацию, которую я использую, можно найти при поиске в Google «Synology NAS rest API«. Я вставил прямую ссылку для скачивания PDF-файла здесь.
Ответ №1:
Согласно связанной документации, для дополнительного параметра требуются дополнительные скобки и кавычки, подобные этому:
https://NAME:5001/webapi/entry.cgi?api=SYNO.FileStation.Listamp;version=2amp;method=list_shareamp;additional=["volume_status"]amp;_sid=TOKEN
В зависимости от используемой библиотеки вам может потребоваться закодировать скобки и кавычки, но большинство библиотек должны сделать это за вас 🙂
Чтобы прийти к такому выводу, вот что я сделал:
В связанной документации я нашел раздел о list_share и приведенный пример:
GET /webapi/entry.cgi?api=SYNO.FileStation.Listamp;version=2amp;method=list_shareamp; additional=["real_path","owner,time"]
Это совершенно нечитаемо, поскольку URL-адрес уже закодирован, но открываем консоль браузера и запускаем
decodeURIComponent("/webapi/entry.cgi?api=SYNO.FileStation.Listamp;version=2amp;method=list_shareamp;additional=["real_path","owner,time"]")
приводит меня к удобочитаемому URL:
/webapi/entry.cgi?api=SYNO.FileStation.Listamp;version=2amp;method=list_shareamp;additional=["real_path","owner,time"]
Это пример того, как войти в систему, распечатать данные и снова выйти из системы:
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.Authamp;method=loginamp;version=3amp;account=${user}amp;passwd=${password}amp;session=testamp;format=sid`
);
const url = `http://${host}/webapi/query.cgi?api=SYNO.FileStation.Listamp;method=list_shareamp;version=2amp;_sid=${sid}amp;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.Authamp;method=logoutamp;version=3amp;session=test`
);
})();
Комментарии:
1. К сожалению, это не помогает, ответ все тот же. До сих пор я даже не думал об использовании библиотеки для этого случая. Я использую узлы HTTPS.request() и сам кодирую параметры. Без библиотеки также не должно быть слишком много работы, поскольку я тестирую свои запросы с помощью Postman, который просто делает простой GET.
2. мой первоначальный ответ был немного неправильным, вы также добавили кавычки?
3. после того, как я увидел, что вы отредактировали свой ответ. Я попробовал то, что вы сделали, а затем понял, что вы имели в виду под «кодированием скобок». Но даже после того, как я изменил свое значение в соответствии с вашим объяснением, я все равно получаю тот же ответ, что и раньше. это то, на что я изменил свое дополнительное значение: «[«volume_path»]» К сожалению, выполнение примера запроса, приведенного в документации, также дает тот же результат.
4. вы используете
volume_path
, но вы должны использоватьvolume_status
.5. Ну, результат определенно отличается, большое вам спасибо! Я все еще не знаю, где я могу найти нужную мне информацию. Но я надеюсь, что это станет ясно, когда я перепроектирую вашу душу.