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アプリケーションの作成」をクリックします。
テキトーに入力して、アプリケーションを作成します。
アプリケーションの詳細を開くと、View APIキーというのがあるのでコレをコピります。
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です。
?theme=light、?theme=darkのURLパラメータを付与することでビュワーのスタイルを変更できたりします。