Synology NAS API получает свободное и полное пространство

#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. Ну, результат определенно отличается, большое вам спасибо! Я все еще не знаю, где я могу найти нужную мне информацию. Но я надеюсь, что это станет ясно, когда я перепроектирую вашу душу.