LoginSignup
0
0

More than 1 year has passed since last update.

Node.js(axios)からDirectCloud-BOX APIでファイル一覧の取得とnode話

Last updated at Posted at 2021-08-27

一連の記事の流れになります。

同じような書き方にはなるのですが、DirectCloudのAPIのドキュメントは注意といった記事です。

また、タイトルにあるnodeはNode.jsの話ではないです。

ファイル一覧取得を試す(GET/POST)

/openapp/v1/files/index/{node}でファイルの一覧を照会できます

APIリファレンス - ファイルの照会

以下のコードで実行します。前の記事で書いたように、{node}は1に指定しています。

このAPIはこの指定がないとうまく動きません。(後述)

また、 このAPIはフォルダリストのAPI(/openapp/v1/folders/index/{node})と同様にドキュメント上だとGETと書いてますが、何故かPOSTも利用できます。

GETの書き方

'use strcit';

const axios = require('axios');

const BASE_URL = `https://api.directcloud.jp`;
const URL = `${BASE_URL}/openapp/v1/files/index/1?lang=eng`
const token = `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`

const main = async () => {

    const res = await axios.get(URL,{
        headers: {
            access_token: token,
        }
    });

    console.log(res.data);
};

main();

何故か動くPOSTの書き方

'use strcit';

const axios = require('axios');

const FormData = require('form-data');

const BASE_URL = `https://api.directcloud.jp`;
const URL = `${BASE_URL}/openapp/v1/files/index/1?lang=eng`
const token = `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`

const main = async () => {
    const bodyFormData = new FormData();

    const res = await axios.post(URL, bodyFormData, {
        headers: {
            access_token: token,
            ...bodyFormData.getHeaders()
        }
    });
    console.log(res.data);
};

main();

実行

どちらも正常に動きます。

実行するとこんな感じの内容になりました。

$ node ls.js 
{
  success: true,
  total: 5,
  lastpage: true,
  lists: [
    {
      file_seq: '287745501',
      name: 'image.png',
      extension: 'png',
      size: '2184218',
      creator: 'xxxxxxxxxxxx',
      datetime: '2021-08-26 05:29:48',
      sizetext: '2.08MB'
    },

省略    

出来てみるとなんてことないですが、後述するように、動くまでに若干詰まりました。

node指定問題 ドキュメントのミスかAPIの設計ミスがありそうFolders API問題

このAPI扱う時にやっかいな nodeという概念があります。
フォルダの場所を示す値っぽいやつです。

FoldersのAPIは、 ドキュメントに必須と書いているのに、何故かnodeを指定しなくても使えてしまってた問題がありました。

フォルダリストの照会のドキュメントを見ると フォルダリストの紹介はnodeは必須と書いてますがなぜか無しでも動きます。

それだけだったら、まぁそういうこともあるかー優しさかなぁ?って感じだったのですが、同じようなAPIの先ほどサンプルを書いた ファイルリストの照会のほうは本当にnodeが必須っぽいです。

入り方が良くなかった可能性もありますが、どっちかに統一してほしいですね。。

"node指定必須と書いているが、node無しで動く"フォルダリストAPI

ドキュメント準拠してないAPIなのか、APIにドキュメントが追いついてないのか。

完全に裏をかいてくるAPIです。

'use strcit';

const axios = require('axios');

const FormData = require('form-data');

const BASE_URL = `https://api.directcloud.jp`;
const URL = `${BASE_URL}/openapp/v1/folders/index/?lang=eng` //node指定がない
const token = `xxxxxxxxxxxxxxxxxxxxxxxx`

const main = async () => {
    const bodyFormData = new FormData();

    const res = await axios.post(URL, bodyFormData, {
        headers: {
            access_token: token,
            ...bodyFormData.getHeaders()
        }
    });
    console.log(res.data);
};

main();

実行結果は正常

$ node folder.js
{
  success: true,
  lists: [
    {
      dir_seq: '38605003',
      node: '1',
省略 

"node指定必須と書いているが、node無しで動く"と思いきや動いてくれないファイルリストAPI

完全に裏をかいてくるAPIです。と先ほど書きましたが、 さらに裏を書いてくるという。

裏の裏で表ですね。はい。

こちらはドキュメント通りにnode必須ですw

'use strcit';

const axios = require('axios');

const FormData = require('form-data');

const BASE_URL = `https://api.directcloud.jp`;
const URL = `${BASE_URL}/openapp/v1/files/index/?lang=eng` //node指定がない
const token = `xxxxxxxxxxxxxxxxxxxxxxxx`

const main = async () => {
    const bodyFormData = new FormData();

    const res = await axios.post(URL, bodyFormData, {
        headers: {
            access_token: token,
            ...bodyFormData.getHeaders()
        }
    });
    console.log(res.data);
};

main();

実行結果はエラー

$ node file.js
{
  success: false,
  all: 'There is no required input value.',
  result_code: '00'
}

うーん、、統一するかドキュメントどうにかしてほしい。

まぁフォルダーの概念を考えるとnode指定がない場合には、ルート的な場所を表示するようにしてるってのは分かるんですけど、そのルート的な場所にはファイルは置けないってことでエラーにするようにしてるんですかね?

まとめ ドキュメントが疑わしい場合もある

まぁドキュメント更新とAPIの機能更新の整合性が取れないタイミングってあるのは分かるので、どこかのタイミングで改善してもらえると嬉しいなと感じました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0