はじめに
REST API を介して、Yellowfin からコンテンツをエクスポートおよびインポートする方法を 3 回に分けて紹介したいと思います。
第 1 回 『Yellowfin REST API エクスポートできるコンテンツの確認』
第 2 回 『Yellowfin REST API コンテンツのエクスポート』
第 3 回 『Yellowfin REST API コンテンツのインポート』
第 2 回は『Yellowfin REST API コンテンツのエクスポート』です。
エクスポートするコンテンツ情報の準備
まずは、エクスポート対象となり得るコンテンツ一覧を取得する必要があります。
そのために実行するプログラムに関しては、『Yellowfin REST API エクスポートできるコンテンツの確認』の記事をご確認ください。
上記プログラムを実行して出力されるコンテンツ一覧の中から、エクスポート対象のコンテンツを抽出し、以下のような情報に成型します。このファイルの情報を、後述する php プログラムで呼び出し、エクスポート処理を実行します。
下記は export という名称のレポートをエクスポートする際の記述例です。
{
"exportFileType": "YFX",
"contentToExport": [
{
"resourceName": "export",
"resourceDescription": "エクスポートするコンテンツ",
"resourceId": 108024,
"resourceUUID": "1e22bd4b-bc0a-433a-ba8c-cac239ff5297",
"resourceType": "REPORT",
"resourceOrgId": 1
}
]
}
JSON ファイルで指定する各項目の説明は、前回記事をご確認ください。
アクセストークンの取得
REST API を介してリソースにアクセスする場合、必ずアクセストークンが必要となります。
トークンの扱いに関しては、『Yellowfin 情報参照プログラム PHP + REST API でロール / ユーザー / グループなどの情報を取得』の「アクセストークンの取得」の個所をご確認ください。
コンテンツのエクスポート
先の手順で取得したトークンを用いて、POST でコンテンツをエクスポートします。HEADER や BODY に必要な情報に関しては、開発者用ドキュメントの Export the passed content で詳細をご確認ください。
以下のサンプルコードでは、cURL で実際のエクスポート処理を実行しています。先に説明した export.json の方法をボディー情報として API に受け渡し、export.yfx に依存関係のあるコンテンツと合わせて、コンテンツをエクスポートする流れです。
ちなみに、トークン取得も含めた処理全容は後述します。
//コンテンツのエクスポート
//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);
コンソールからプログラムを実行します。
PS> php exportContent.php
php を実行したディレクトリに、export.yfx が出力されます。
出力内容の確認
export.yfx に含まれる情報を確認してみます。
取得したアクセストークンを使って、以下を実行すると、プログラムを実行するコンソール上に、同ファイルに含まれるコンテンツ一覧が確認できます。トークン取得も含めた処理全容は後述します。
//参照処理
$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);
出力結果は以下の通りです。レポートを指定してエクスポートすると、データソース、ビュー、フォルダなど、依存関係のあるコンテンツが一通りエクスポートされます。
{
"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"
]
}
}
}
プログラム全容
//変数の宣言
$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);
//変数の宣言
$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!!