Box Java SDKで、Box APIを試してみる

# 概要
BoxのWeb APIを使い、会社の業務システムからBoxのファイルを操作したいと思っています。
システム内で生成したファイルを、Boxにアップロードするイメージです。
調べてみると、[各種プログラム言語のSDKがある](https://ja.developer.box.com/sdks-and-tools/)ようなので、今回はJava SDKを使ってみようと思います。

# 認証をクリアする
APIを使うにはまずは認証をクリアしなければいけません。
BoxのAPIにはいくつかの認証方式が用意されていますが、今回のユースケースでは[JWT認証](https://ja.developer.box.com/guides/authentication/jwt/)が適切だと思います。
他の認証方式については、[公式ドキュメント](https://ja.developer.box.com/guides/authentication/select/)をチェックしてください。

プログラムを書く前に、まずは認証をクリアするためにアプリケーションをBoxに登録します。

## アプリケーションを登録する
基本的には下記手順の通りでOKです。
[JWTを使用した設定](https://ja.developer.box.com/guides/applications/custom-apps/jwt-setup/)

[公開キーと秘密キーのペア](https://ja.developer.box.com/guides/applications/custom-apps/jwt-setup/#%E5%85%AC%E9%96%8B%E3%82%AD%E3%83%BC%E3%81%A8%E7%A7%98%E5%AF%86%E3%82%AD%E3%83%BC%E3%81%AE%E3%83%9A%E3%82%A2)のセクションでは、今回は「キーペアの生成」を選択します。

[手順](https://ja.developer.box.com/guides/applications/custom-apps/jwt-setup/#%E3%82%AD%E3%83%BC%E3%83%9A%E3%82%A2%E3%81%AE%E7%94%9F%E6%88%90-%E6%8E%A8%E5%A5%A8)通り「公開/秘密キーペアを生成」を押すと、Jsonファイルがダウンロードされるので、Javaプロジェクトのクラスパスに入れておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230422/aa45d512-0ef0-c82b-1a40-633bcaaeb7e4.png)

# Java SDKを使う
## インストール
SDKは、Mavenのセントラルリポジトリにありますので、簡単に利用する事ができます。

```maven
<dependency>
    <groupId>com.box</groupId>
    <artifactId>box-java-sdk</artifactId>
    <version>2.48.0</version>
</dependency>
```

SDKをの使い方をざっと学習するには↓を見るのが良いでしょう。
[SDK Overview](https://github.com/box/box-java-sdk/blob/main/doc/overview.md)

以下、簡単な操作を試してみます。

## セッションを接続する
先程クラスパスに入れておいたJsonファイルを読み込む事で、↓のコードで認証を済ませる事ができます。

```Java:BoxSdkTest.java
Reader reader = new InputStreamReader(BoxSdkTest.class.getClassLoader().getResourceAsStream("config.json"));
BoxConfig boxConfig = BoxConfig.readFrom(reader);
BoxDeveloperEditionAPIConnection api = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig);
```

## ユーザ情報を表示する
認証を済ませたものの、今自分がログインしているユーザを知る必要があります。
Boxのファイルやフォルダは、権限のあるユーザでないと操作する事ができないからです。
下記のコードでユーザ名を表示してみましょう。

```Java
BoxUser user = BoxUser.getCurrentUser(api);
BoxUser.Info userInfo = user.getInfo();
System.out.println("userInfo : "+ userInfo.getName());
```

コンソールには、事前に登録したアプリケーション名が表示されたはずです。
登録したアプリケーション自身のユーザとしてログインしている状態のようです。
このユーザの事を、Boxでは「サービスアカウント」と呼んでいます。

Box APIで使用できるユーザには、[いくつかの種類があります](https://ja.developer.box.com/guides/authentication/user-types/)が、今回はこのサービスアカウントを使っていく事にします。


## フォルダ情報を表示する
サービスアカウントは、普通のユーザと同じように、ファイルやフォルダにコラボレータとして追加する事ができます。
「一般構成」の「サービスアカウント情報」に、サービスアカウントのメールアドレスが表示されているので、これを目的のフォルダにコラボレータとして追加してみます。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230422/863c7ed3-f9cc-2d2c-66df-6b160e4a7522.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230422/c3882610-aa64-5543-60cb-a6112d0236e2.png)

---

下記のようなコードで、このフォルダの情報を表示する事ができます。

```Java
BoxFolder folder = new BoxFolder(api, "***********");
BoxFolder.Info info = folder.getInfo();
System.out.format("[%s] %s\n", info.getID(), info.getName());
```

`BoxFolder`のコンストラクタに渡している`***********`には、フォルダIDを指定します。
フォルダIDは、目的のフォルダのURLに含まれています。`https://app.box.com/folder/***********`という感じになっているので、`folder`の次にある数字を入れてください。

## ファイルをアップロードする
このフォルダに、ファイルをアップロードしてみましょう。

```java
FileInputStream input = new FileInputStream("hoge.pdf");
BoxFile.Info newFileInfo = folder.uploadFile(input, "test.pdf");
System.out.println("https://app.box.com/file/" + newFileInfo.getID());
```

これで、ローカルの`hoge.pdf`が`test.pdf`として目的のフォルダにアップロードされ、コンソールには、そのURLが表示されます。