BoxのAPIを使ってみる
前々回に書いたblogで、Kintone-Questetra-Boxの連携を書きましたが、BoxのAPIは、少し癖があり、それを考慮しないとうまく動作しないことがあるので、そのあたりを書いてみたいと思います。
これ、結構痛い仕様です。これは、開発者マニュアルに記載があります。ここ。
最初は、これに気づいておらず、作成したフォルダを検索しようとすると、見つからないという現象がたまにおきました。今回の連携では、最初にアップロードするフォルダが既に存在しているかどうかを先にチェックをして、存在する場合には、そのフォルダIDを取得します。存在しない場合には新規でフォルダを作成します。Questetraでは、以下のようなタスクになっています。
コンテンツ(ここではフォルダ)を検索するAPIは、以下のように利用します。この例は、folderでフォルダ名が2017-04-01を検索しています。
https://api.box.com/2.0/search?query=2017-04-01&type=folder&scope=user_content&content_types=name
戻り値は、JSON形式になります。
[フォルダがある場合]
{"total_count":1,"entries":[{"type":"folder","id":"13xxxx56xxx","sequence_id":"0","etag":"0","name":"2017-04-01","created_at":"2016-12-03T21:07:01-08:00","modified_at":"2017-02-23T17:29:42-08:00","description":"","size":74727544,"path_collection":{"total_count":2,"entries":[{"type":"folder","id":"0","sequence_id":null,"etag":null,"name":"u30d5\u30a1\u30a4\u30eb"},{"type":"folder","id":"111xxxxxxx","sequence_id":"1","etag":"1","name":"RenewalNot"}]},"created_by":{"type":"user","id":"330xxxxxxx","name":"Takashi Kodama","login":"takashi@miraclelinux.com"},"modified_by":{"type":"user","id":"330xxxxxxxx","name":"Takashi Kodama","login":"takashi@miraclelinux.com"},"trashed_at":null,"purged_at":null,"content_created_at":"2016-12-03T21:07:01-08:00","content_modified_at":"2017-02-23T17:29:42-08:00","owned_by":{"type":"user","id":"330xxxxx","name":"Takashi Kodama","login":"takashi@miraclelinux.com"},"shared_link":null,"folder_upload_email":null,"parent":{"type":"folder","id":"111xxxxxxx","sequence_id":"1","etag":"1","name":"RenewalNot"},"item_status":"active"}],"limit":1,"offset":0}
[フォルダが無い場合]
{"total_count":0,"entries":[],"limit":30,"offset":0}
指定したフォルダが存在するかしないかは、JSONのtotal_countが0かどうかをチェックすることで判断ができます。
今回の一連のサポート更新処理は、1件ごとにKIntoneの画面から処理が開始されるわけですが、同じフォルダに別々のファイルをアップロードするケースが想定されるため、最初にフォルダを作成してから別の更新処理実施するタイミングが1分程度だとフォルダが存在するのにフォルダが見つからないという現象が出てしまう可能性があります。およそのケースは、問題が発生していないのも事実なのですが、仕様上は、保証されない動作になります。かといって、じゃあ10分間隔で1件を処理して下さい。と業務担当者に依頼するのも業務効率化の上では本末店頭になります。
ただ、動作をよくよく見てみると、新規フォルダを作成直後でも、上記の「フォルダが無い場合」のJSONが返ってくるケースは、ほとんどないため、WFのタスク内で1分待つ処理を入れることで現在のところは問題回避をしています。(業務担当者が1件処理するのに1分程度+1分で2分あればおおよそのケースは問題がないという発想です)
その他利用しているAPIを参考までにご紹介しておきます。
createとかのパラメータがあるわけではなく、以下のAPIで名前と作成する親フォルダのIDを指定します。この例は、2017-04-01のフォルダを親フォルダ111xxxxxxxxに作成する処理になります。
https://api.box.com/2.0/folders
{"name":"2016-04-01", "parent": {"id": "111xxxxxxxx"}}
- クエステトラから上記のBox APIをコールする場合には、以下の設定をしておきます。
「通信設定」のアクセスURLにAPIのURLを記載します。パラメータ部分は、リクエストボディに記載をしておきます。
リクエストボディには、クエステトラでパラメータを代入している項目を選択しておきます。
以下のように引数であるJSON文字列をクエステトラの文字列データに代入しておきます。
- ファイルのアップロード https://ja.docs.box.com/reference#upload-a-file
https://upload.box.com/api/2.0/files/content
クエステトラの連携では、送信パラメータにfilenameとparent_idをセットすれば使える。
新規でファイルをアップロードするAPIと既存ファイルを更新する場合には、APIが異なる。(当初は、同じAPIでクラウドサービス側でファイルが存在していれば自動的に更新になると考えていた)
https://upload.box.com/api/2.0/files/fileのID番号/content
上記のファイルアップロードと同様にクエステトラの連携の場合には、送信パラメータをセットするだけで使える。
この例は、指定したファイルIDに期限付き(2017-03-06まで)の共有リンクを作成する。
https://api.box.com/2.0/files/folderのID番号
{"shared_link": { "access": "open","password": "xxxxxxx","unshared_at":"2017-03-06","permissions": { "can_download": true,"can_preview":true }}}
今回BoxのAPIを使うためにGoogleなどを検索したのですが、オフィシャルのオンラインマニュアルの情報以外にはあまり探すことができませんでした。そのために。Box APIを利用している人はまだまだ少ないと感じるとともに、少し癖のあるAPIのため、連携部分のつなぎ込みには、結構苦労しました。ただ、世界の企業で利用されているSaaSサービスですので、必要なAPIも揃っていますから、これからどんどん他のSaaSとの連携構築をする人が増えていけば、よりよい事例ができていくのではないかと思います。