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


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

- [紙で申請を出す居酒屋店員のシフト希望と管理業務をちょっとスマートにする](https://qiita.com/n0bisuke/items/0c6d6a236b31e3897d41)
	- [Node.js（axios）からDirectCloud-BOX APIでファイルのDL #linedc](https://qiita.com/n0bisuke/items/0aec6dc65a1fc0b4c5b5)
	- [Node.js（axios）からDirectCloud-BOX APIでファイルアップロード](https://qiita.com/n0bisuke/items/35659ffdf00f2158da98)

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

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

## ファイル一覧取得を試す（GET/POST）

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

> [APIリファレンス - ファイルの照会](https://directcloud.jp/api_reference/detail/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC/File#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%85%A7%E4%BC%9A)

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

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

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

### GETの書き方

```js
'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の書き方

```js
'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();
```

### 実行

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

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

```bash
$ 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を指定しなくても使えてしまってた問題がありました。**

[フォルダリストの照会のドキュメント](https://directcloud.jp/api_reference/detail/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC/Folder#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E7%85%A7%E4%BC%9A)を見ると **フォルダリストの紹介はnodeは必須と書いてますがなぜか無しでも動きます。**

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

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

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

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

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

```js
'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();
```

実行結果は正常

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

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

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

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

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

```js
'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();
```

実行結果はエラー

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

```

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

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

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

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