第 3 回 Yellowfin REST API コンテンツのインポート

## はじめに
REST API を介して、Yellowfin からコンテンツをエクスポートおよびインポートする方法を 3 回に分けて紹介したいと思います。
[第 1 回 『Yellowfin REST API エクスポートできるコンテンツの確認』](https://qiita.com/ExtremeCarvFJ/items/34447db30788b8a1445e)
[第 2 回 『Yellowfin REST API コンテンツのエクスポート』](https://qiita.com/ExtremeCarvFJ/items/b00a1f982ea5f3b480b5)
第 3 回 『Yellowfin REST API コンテンツのインポート』

第 3 回は『Yellowfin REST API コンテンツのインポート』です。

## インポートするコンテンツの準備
[前回記事](https://qiita.com/ExtremeCarvFJ/items/b00a1f982ea5f3b480b5)で、export.yfx にレポートをエクスポートしました。export.yfx には、レポートと依存関係のあるコンテンツが一通り含まれています。このファイルをインポートします。

## アクセストークンの取得
REST API を介してリソースにアクセスする場合、必ずアクセストークンが必要となります。
トークンの扱いに関しては、[『Yellowfin 情報参照プログラム PHP + REST API でロール / ユーザー / グループなどの情報を取得』](https://qiita.com/ExtremeCarvFJ/items/0d3d9005b03e917ad839)の「アクセストークンの取得」の個所をご確認ください。

## コンテンツのインポート
先の手順で取得したトークンを用いて、POST でコンテンツをインポートします。HEADER や BODY に必要な情報に関しては、開発者用ドキュメントの [Import the contents of the passed import file](https://developers.yellowfinbi.com/dev/api-docs/current/#operation/importContent) で詳細をご確認ください。
以下のサンプルコードでは、cURL で実際のインポート処理を実行しています。--form の形式で、export.yfx を読み込んで、エクスポートされたコンテンツをインポートしています。
ちなみに、トークン取得も含めた処理全容は後述します。
```php:import.php
//インポート処理
$text ='curl -X "POST" "http://localhost:8080/api/rpc/import-export/import-content" ';
$text = $text.'-H "Accept: application/vnd.yellowfin.api-v2+json" ';
$text = $text.'-H "Authorization: YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken.'" ';
$text = $text.'-H "Content-Type: multipart/form-data" -H "cache-control: no-cache" ';
$text = $text.'--form "contentToProcess=@export.yfx;type=application/octet-stream" ';
echo exec($text);
```

コンソールからプログラムを実行します。
```powershell:プログラム実行
PS> php .\import.php
```
コンテンツがインポートされます。

## プログラム全容
```php:import.php
//変数の宣言
$adminId = 'admin@yellowfin.com.au';
$adminPassword = 'test';
$time = ceil(microtime(true)*1000);
$url = 'http://localhost:8080/api/refresh-tokens';
$url2 = 'http://localhost:8080/api/access-tokens';
$refreshToken = "";
$accessToken = "";

//リフレッシュトークン
$header = array(
	'Authorization:YELLOWFIN ts='.$time.', nonce=123',
	'Accept:application/vnd.yellowfin.api-v2+json',
	'Content-Type:application/json;charset=UTF-8'
);

$body = array(
	'userName'=>$adminId,
	'password'=>$adminPassword
);
$body_json = json_encode($body, JSON_PRETTY_PRINT);

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $body_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
$json_result = json_decode($result);
$refreshToken = $json_result->securityToken;
curl_close($ch);

//アクセストークン
$header2 = array(
	'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$refreshToken,
	'Accept:application/vnd.yellowfin.api-v2+json',
	'Content-Type:application/json'
);

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_HTTPHEADER, $header2);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch2, CURLOPT_POSTFIELDS, '');
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_close($ch);
$result2 = curl_exec($ch2);
$json_result2 = json_decode($result2);
$accessToken=$json_result2->securityToken;

//インポート処理
$text ='curl -X "POST" "http://localhost:8080/api/rpc/import-export/import-content" ';
$text = $text.'-H "Accept: application/vnd.yellowfin.api-v2+json" ';
$text = $text.'-H "Authorization: YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken.'" ';
$text = $text.'-H "Content-Type: multipart/form-data" -H "cache-control: no-cache" ';
$text = $text.'--form "contentToProcess=@export.yfx;type=application/octet-stream" ';
echo exec($text);
```

## 最後に
REST API を介したコンテンツのインポートとエクスポートに関わる内容を 3 回に分けてシリーズ化した。
Yellowfin には、管理用のレガシー API として Webservice も準備されています。使い勝手の柔軟性の高さから、今後は REST API を中心に管理用の API の拡充が進んでいきます。

何はともあれ、良いデータ分析を! See you then! Cheers!!