第 2 回 Yellowfin REST API コンテンツのエクスポート

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

第 2 回は『Yellowfin REST API コンテンツのエクスポート』です。

## エクスポートするコンテンツ情報の準備
まずは、エクスポート対象となり得るコンテンツ一覧を取得する必要があります。
そのために実行するプログラムに関しては、[『Yellowfin REST API エクスポートできるコンテンツの確認』](https://qiita.com/ExtremeCarvFJ/items/34447db30788b8a1445e)の記事をご確認ください。

上記プログラムを実行して出力されるコンテンツ一覧の中から、エクスポート対象のコンテンツを抽出し、以下のような情報に成型します。このファイルの情報を、後述する php プログラムで呼び出し、エクスポート処理を実行します。
下記は export という名称のレポートをエクスポートする際の記述例です。

```json:export.json
{
   "exportFileType": "YFX",
   "contentToExport": [
      {
        "resourceName": "export",
        "resourceDescription": "エクスポートするコンテンツ",
        "resourceId": 108024,
        "resourceUUID": "1e22bd4b-bc0a-433a-ba8c-cac239ff5297",
        "resourceType": "REPORT",
        "resourceOrgId": 1
      }
   ]
}
```
JSON ファイルで指定する各項目の説明は、[前回記事](https://qiita.com/ExtremeCarvFJ/items/34447db30788b8a1445e)をご確認ください。

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

## コンテンツのエクスポート
先の手順で取得したトークンを用いて、POST でコンテンツをエクスポートします。HEADER や BODY に必要な情報に関しては、開発者用ドキュメントの [Export the passed content](https://developers.yellowfinbi.com/dev/api-docs/current/#operation/exportContent) で詳細をご確認ください。
以下のサンプルコードでは、cURL で実際のエクスポート処理を実行しています。先に説明した export.json の方法をボディー情報として API に受け渡し、export.yfx に依存関係のあるコンテンツと合わせて、コンテンツをエクスポートする流れです。
ちなみに、トークン取得も含めた処理全容は後述します。

```php: export.php
//コンテンツのエクスポート
//API
$url3 = 'http://localhost:8080/api/rpc/import-export/export-content';

//ヘッダー
$header3 = array(
	'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
	'Accept:application/vnd.yellowfin.api-v2+json',
	'Content-Type:application/json;charset=UTF-8'
);

//データ読み込み
ob_start();
include("export.json");
$exportData = ob_get_clean();

//cURLで処理実行
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch3, CURLOPT_POSTFIELDS, $exportData);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_URL, $url3);
$result3 =curl_exec($ch3);
file_put_contents('export.yfx', $result3);
curl_close($ch3);
```

コンソールからプログラムを実行します。
```powershell:php 実行
PS> php exportContent.php
```

php を実行したディレクトリに、export.yfx が出力されます。

## 出力内容の確認
export.yfx に含まれる情報を確認してみます。
取得したアクセストークンを使って、以下を実行すると、プログラムを実行するコンソール上に、同ファイルに含まれるコンテンツ一覧が確認できます。トークン取得も含めた処理全容は後述します。

```php: refer.php
//参照処理
$option = array(
	'itemIndex'=>$item_index,
	'OPTION'=>$option_key
);
$text ='curl -X "POST" "http://localhost:8080/api/rpc/import-export/get-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 json_encode(json_decode(exec($text)), JSON_PRETTY_PRINT);
```
出力結果は以下の通りです。レポートを指定してエクスポートすると、データソース、ビュー、フォルダなど、依存関係のあるコンテンツが一通りエクスポートされます。
```json:出力内容
{
    "items": [
        {
            "resourceName": "\u30c7\u30e2",
            "resourceDescription": "",
            "resourceId": 106793,
            "resourceUUID": "0eb07d29-135b-4565-861b-c8c417c24a6a",
            "resourceType": "DATASOURCE"
        },
        {
            "resourceName": "export",
            "resourceDescription": "",
            "resourceId": 108018,
            "resourceUUID": "5f4a9612-825c-4e16-8dc6-d1ce12f7d514",
            "resourceType": "VIEW"
        },
        {
            "resourceName": "export",
            "resourceId": 108014,
            "resourceUUID": "0614acbe-3632-4429-b157-7b8dc92da11b",
            "resourceType": "RPTCATEGORY",
            "resourceCode": "EXPORT"
        },
        {
            "resourceName": "content",
            "resourceId": 108015,
            "resourceUUID": "526cc0e1-6305-4946-a598-a6ddf841f404",
            "resourceType": "RPTSUBCATEGORY",
            "resourceCode": "CONTENT"
        },
        {
            "resourceName": "export",
            "resourceDescription": "",
            "resourceId": 108024,
            "resourceUUID": "1e22bd4b-bc0a-433a-ba8c-cac239ff5297",
            "resourceType": "REPORT"
        }
    ],
    "_links": {
        "menu": {
            "href": "\/api\/menus\/mobile-menu",
            "options": [
                "GET"
            ]
        },
        "api": {
            "href": "\/api",
            "options": [
                "GET"
            ]
        },
        "self": {
            "href": "\/api\/rpc\/import-export\/get-import-content",
            "options": [
                "POST"
            ]
        }
    }
}
```

## プログラム全容
```php:export.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;

//コンテンツのエクスポート
//API
$url3 = 'http://localhost:8080/api/rpc/import-export/export-content';

//ヘッダー
$header3 = array(
	'Authorization:YELLOWFIN ts='.$time.', nonce=123, token='.$accessToken,
	'Accept:application/vnd.yellowfin.api-v2+json',
	'Content-Type:application/json;charset=UTF-8'
);

//データ読み込み
ob_start();
include("export.json");
$exportData = ob_get_clean();

//cURLで処理実行
$ch3 = curl_init();
curl_setopt($ch3, CURLOPT_HTTPHEADER, $header3);
curl_setopt($ch3, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch3, CURLOPT_POSTFIELDS, $exportData);
curl_setopt($ch3, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch3, CURLOPT_URL, $url3);
$result3 =curl_exec($ch3);
file_put_contents('export.yfx', $result3);
curl_close($ch3);
```

```php:refer_file.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;

//参照処理
$option = array(
	'itemIndex'=>$item_index,
	'OPTION'=>$option_key
);
$text ='curl -X "POST" "http://localhost:8080/api/rpc/import-export/get-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 json_encode(json_decode(exec($text)), JSON_PRETTY_PRINT);
```

## 最後に
今回は、REST API を使ってコンテンツをエクスポートする方法を紹介いたしました。
次回、エクスポートしたコンテンツをインポートしたいと思います。

皆様、良いデータ分析を! See you then! Cheers!!