0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-05-16

はじめに

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 という名称のレポートをエクスポートする際の記述例です。

export.json
{
   "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 に依存関係のあるコンテンツと合わせて、コンテンツをエクスポートする流れです。
ちなみに、トークン取得も含めた処理全容は後述します。

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);

コンソールからプログラムを実行します。

php 実行
PS> php exportContent.php

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

出力内容の確認

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

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);

出力結果は以下の通りです。レポートを指定してエクスポートすると、データソース、ビュー、フォルダなど、依存関係のあるコンテンツが一通りエクスポートされます。

出力内容
{
    "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"
            ]
        }
    }
}

プログラム全容

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);
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!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?