2015-07-31

Box API叩いてみる【ViewAPI編】

今回はBoxView APIを叩いてみます。

View APIとはPDFやOfficeドキュメントをHTMLに埋め込んで表示するためのAPIになります。

HTMLに埋め込むためにはPDFやOfficeドキュメントをHTMLにコンバートする必要があります。

 

ドキュメントのアップロード(&コンバート@バックエンド)

→ドキュメントを閲覧するためのセッション(有効期限)を作成

→発行されたセッションIDを使ってURLを生成し、iframe等で表示

というフローで実装することになります。

 

今回はApexでSalesforceの添付ファイルをコンバートし、外部公開用のURLを発行してみます。

参考URL→https://box-content.readme.io/docs/viewing-your-first-document

1. アプリケーションの作成

View API用のアプリケーションを作成します(Content APIとは別)

https://app.box.com/developers/services にアクセスして

「Boxアプリケーションの作成」をクリックします。

box-view-api-create-app

テキトーに入力して、アプリケーションを作成します。

box-view-api-create-app2

アプリケーションの詳細を開くと、View APIキーというのがあるのでコレをコピります。

box-view-api-app-info

2. ドキュメントのアップロード

アップロードにはファイルそのものをアップロードするスタイルと

外部公開されているURLを指定するスタイルの2種類があります。

今回はファイルそのものをアップロードしてみます。

ファイルそのものをアップロードする場合はContent-Type: multipart/form-dataで

送信する必要があります。

Apexからバイナリデータをmultipart/form-dataで送る方法は以下の記事を参照。

Apexからmultipart/form-data形式で送信してみる。

 

サンプルはこちら↓。Authorizationヘッダには1のView APIキーを入れてください。

Attachment atch = [SELECT id, Body FROM Attachment WHERE id = '00PA000000gBAiI'];

HttpRequest req = new HttpRequest();
String tokenKey = 'Input Your Token';
String boundary = 'boundary';

req.setHeader('Authorization', 'Token ' + tokenKey);
req.setHeader('Content-Type','multipart/form-data; boundary=' + boundary);
req.setMethod('POST');
req.setEndpoint('https://upload.view-api.box.com/1/documents');

String body = '--'+boundary+'\r\nContent-Disposition: form-data; name="file"; filename="hoge.pdf";\r\nContent-Type: application/pdf\r\nContent-Transfer-Encoding: base64\r\n\r\n' + 
EncodingUtil.base64Encode(atch.Body) + '\r\n--' + boundary + '--';

req.setBody(body);
req.setTimeout(120000);

Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());

curlだとこんな感じ

curl https://upload.view-api.box.com/1/documents \
-H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-type: multipart/form-data" \
-F file=@A_FILE_TO_UPLOAD

レスポンスはこんな感じ

{
    "type": "document",
    "id": "********",
    "status": "queued",
    "name": "",
    "created_at": "2015-07-31T06:15:08.380Z"
}

PDF/OfficeドキュメントからHTMLへの変換はバックエンドで非同期で行われます。

そのため、送信直後はqueuedというステータスが返却されます。

ちなみに変換処理の完了通知手段としてwebhookを利用できるそうです(要申請)。

3. セッションの発行

アップロードされたドキュメントはそのままでは外部公開されないので

セッションを発行して外部公開できるようにします。

curlだとこんな感じ

curl https://view-api.box.com/1/sessions \
-H "Authorization: Token YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"document_id": "THE_DOCUMENT_ID", "duration": 60}' \
-X POST

Apexだとこんな感じ

HttpRequest req = new HttpRequest();
String tokenKey = 'Input Your Token';
req.setHeader('Authorization', 'Token ' + tokenKey);
req.setHeader('Content-Type','application/json');
req.setMethod('POST');
req.setEndpoint('https://view-api.box.com/1/sessions');
req.setBody(JSON.serialize(new Map<String, Object>{
    'document_id' => 'Input Your Document ID',
    'duration' => 60
}));
req.setTimeout(120000);

Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());

レスポンスはこんな感じ

{
    "type": "session",
    "id": "*********",
    "document": {
        "type": "document",
        "id": "*********",
        "status": "done",
        "name": "",
        "created_at": "2015-07-31T05:01:27Z"
    },
    "expires_at": "2015-07-31T06:02:12.122Z",
    "urls": {
        "view": "https://view-api.box.com/1/sessions/*********/view",
        "assets": "https://view-api.box.com/1/sessions/*********/assets/",
        "realtime": "https://view-api.box.com/sse/*********"
    }
}

urls.viewの値が外部公開用のURLになります。

durationで指定した値が有効期限(minutes)になります。

PDF/OfficeドキュメントからHTMLへの変換処理が完了していない場合は

ステータスコード202が返却されます。

 

あとはurls.viewのURLを埋め込むなり通知するなりするだけでOKです。

box-view-api

?theme=light、?theme=darkのURLパラメータを付与することでビュワーのスタイルを変更できたりします。

box-view-api-theme-dark

このエントリーをはてなブックマークに追加