CDataのRESTドライバーを利用して、freeeのデータをMotionBoardで表示してみた 

MotionBoardのサポートをしているウイングアーク１ｓｔ株式会社の杉山です。

今回ご紹介したい内容は、
CDataのRESTドライバーを利用することで、RESTfulAPIを使ったWebシステムから渡されるJSONデータをMotionBoardでデータソースとしてアクセスすることができます。
本記事では、freeeが提供しているfreeeAPIが出力するデータをMotionBoardで表示してみたいと思います。

## freee側の設定について
<p>freeeのデータは、freeeAPIから取得します。本記事では無料の開発者向けアカウントを利用しています。</p>

　１．次のURLを参考にアプリを作成します。
　　　　freee API スタートガイド
　　　　[https://developer.freee.co.jp/startguide](https://developer.freee.co.jp/startguide)

　２．上記、手順の中で発行されるアプリの次の情報を控えておきます。
　　　　「コールバックURL」
　　　　「Client ID」
　　　　「Client Secret」
　　　　「モバイル・JSアプリ認証用URL」
　　　　　![1-2キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/67f02382-10c3-508c-dc91-4c64e50a5d32.jpeg)

　３．アプリでアクセス許可できるデータを選択します。
　　　　　![1-3キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/24db45bb-d5dc-c337-c234-5538ea6c92e7.jpeg)

　４．作成したアプリからデータを取得できるか確認します。
　　　アクセストークンを「モバイル・JSアプリ認証用URL」で取得して、curlを利用して、事業所情報を取得します。
　　　　　![1-4キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/8eac8ea2-bba5-5134-924e-bdcc4c779b79.jpeg)
　　　アクセストークンを取得したら、次のURLより、curlで実行できるコマンドを生成して、コマンドラインツールで実行を行い結果が返ってくるか確認します。
　　　　Companies事業所
　　　　https://developer.freee.co.jp/reference/accounting/reference#/Companies/get_companies
　　　　![1-5キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/a64aa5ba-61cb-b151-7f00-b53a3d688762.jpeg)
　以上でfreee側の設定は完了です。

## MotionBoard側の設定について

CDataのRESTドライバーを利用する際に使用するものが、RSDファイルと言う定義ファイルです。
RSDファイルの役割としては次のようなイメージになります。
　![2-1キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/3750332d-e88d-de5d-0b33-b8ea82d95296.jpeg)

### API Companies事業所のデータを取得するための設定方法

 １．freeeに対して、正常にレスポンスが返ってくることを確認します。
　　　　Companies事業所
　　　　https://developer.freee.co.jp/reference/accounting/reference#/Companies/get_companies
　　　　上記の仕様を元にcurlで確認します。
　　　　![2-2キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/ce76d876-0d47-f773-c2ab-438a1a4502d8.jpeg)
　　　　実行内容
``````
curl -X GET "https://api.freee.co.jp/api/1/companies" -H "accept: application/json" -H "Authorization: Bearer 0a29ba0060e83fcfdc1ea5944c045d9b72d025fe50ee3ae6ff94b4892ff96432" -H "X-Api-Version: 2020-06-15"
`````` 
　　　　レスポンス内容
``````
{"companies":[{"id":10079911,"name":null,"name_kana":null,"display_name":"開発用テスト事業所","role":"admin"},{"id":10081033,"name":null,"name_kana":null,"display_name":"開発用テスト事業所","role":"admin"}]}
``````

　２．上記の内容を元にRSDファイルを作成します。
　　　　RSDファイルにより、任意のパラメーターをリクエスト時に渡すことができ、JSONデータを好きな形式で定義してテーブル化することができます。
``````html
<api:script xmlns:api="http://apiscript.com/ns?v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- See Column Definitions to specify column behavior and use XPaths to extract column values from JSON. -->
  <api:info title="json" desc="Generated schema file." xmlns:other="http://apiscript.com/ns?v1">
    <!-- You can modify the name, type, and column size here. -->
    <!-- Responseは指定したカラムの順番で返却されます。 -->
    <attr name="id"             xs:type="integer"    readonly="false"         other:xPath="/companies/id"            />
    <attr name="name"           xs:type="string"     readonly="false"         other:xPath="/companies/name"          />
    <attr name="name_kana"      xs:type="string"     readonly="false"         other:xPath="/companies/name_kana"     />
    <attr name="display_name"   xs:type="string"     readonly="false"         other:xPath="/companies/display_name"  />
    <attr name="role"           xs:type="string"     readonly="false"         other:xPath="/companies/role"          />
  </api:info>

  <api:set attr="JSONPath"           value="$.companies" />
  <api:set attr="DataModel"          value="Document" />

  <api:set attr="Method"             value="GET" />
  <api:set attr="URI"                value="https://api.freee.co.jp/api/1/companies" />
  <api:set attr="ContentType"        value="application/json;charset=UTF-8" />
  <api:set attr="Header:Name#1"      value="Authorization" />
  <api:set attr="Header:Value#1"     value="Bearer 0a29ba0060e83fcfdc1ea5944c045d9b72d025fe50ee3ae6ff94b4892ff96432" />
  <api:set attr="Header:Name#2"      value="X-Api-Version" />
  <api:set attr="Header:Value#2"     value="2020-06-15" />

  <!-- The GET method corresponds to SELECT. Here you can override the default processing of the SELECT statement. The results of processing are pushed to the schema's output. See SELECT Execution for more information. -->
  <api:script method="GET">
    <api:call op="jsonproviderGet">
      <api:push/>
    </api:call>
  </api:script>

</api:script>
`````` 
　　　　上記状態でもfreeeAPIからデータを取得することができますが、アクセストークンが固定値なので動的に変更できるようにします。
　　　　RSDファイルでダミーカラムを定義して、アクセストークンを入力値によって変えられるようにします。
``````html
<api:script xmlns:api="http://apiscript.com/ns?v1" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- See Column Definitions to specify column behavior and use XPaths to extract column values from JSON. -->
  <api:info title="json" desc="Generated schema file." xmlns:other="http://apiscript.com/ns?v1">
    <!-- You can modify the name, type, and column size here. -->
    <!-- Responseは指定したカラムの順番で返却されます。 -->
    <attr name="id"             xs:type="integer"    readonly="false"         other:xPath="/companies/id"            />
    <attr name="name"           xs:type="string"     readonly="false"         other:xPath="/companies/name"          />
    <attr name="name_kana"      xs:type="string"     readonly="false"         other:xPath="/companies/name_kana"     />
    <attr name="display_name"   xs:type="string"     readonly="false"         other:xPath="/companies/display_name"  />
    <attr name="role"           xs:type="string"     readonly="false"         other:xPath="/companies/role"          />
    <input name="input_Authtoken"   xs:type="string"   required="false" />
　　<!-- ↑↑ダミーカラムを定義↑↑ -->
  </api:info>

  <api:set attr="JSONPath"           value="$.companies" />
  <api:set attr="DataModel"          value="Document" />

  <api:set attr="Method"             value="GET" />
  <api:set attr="URI"                value="https://api.freee.co.jp/api/1/companies" />
  <api:set attr="ContentType"        value="application/json;charset=UTF-8" />
  <api:set attr="Header:Name#1"      value="Authorization" />
  <api:set attr="Header:Value#1"     value="Bearer [_input.input_Authtoken]" />
　　　　　　　　　　　　　　　　　　　　　　　　　　　　<!-- ↑↑ダミーカラムから取得する値を設定する↑↑ -->　
  <api:set attr="Header:Name#2"      value="X-Api-Version" />
  <api:set attr="Header:Value#2"     value="2020-06-15" />

  <!-- The GET method corresponds to SELECT. Here you can override the default processing of the SELECT statement. The results of processing are pushed to the schema's output. See SELECT Execution for more information. -->
  <api:script method="GET">
    <api:call op="jsonproviderGet">
      <api:push/>
    </api:call>
  </api:script>

</api:script>

``````
　３．「2」で作成したRSDファイルをMotionBoardの共有フォルダーに配置します。
　　　　![2-4キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/96f9104d-0955-3b60-c2b2-fb745588a93d.jpeg)

　４．RESTの外部接続を作成します。
　　　RESTはMotionBoardで先行版のアダプターとし公開しています。RESTをダウンロードして、MotionBoardに組み込みます。
　　　所定の位置に配置してMotionBoardを再起動すると、以下のように外部接続設定にRESTを新規接続先として利用できるようになります。
　　　　MotionBoard Ver. 6.3 CDataアダプターの配布
　　　　https://cs.wingarc.com/ja/system_requirement/000022671
　　　［外部接続］の［新規作成］にて「REST」を選択します。
　　　　![2-5キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/5ea9a1b6-8102-8c03-6aae-c4686a2b4835.jpeg)
　　　［基本情報］にて［ドライバタイプ］を「REST JSON FULL(JDBC)」を選択、［ファイルパス］に「3」で格納したRSDファイルのフォルダーを指定します。
　　　［接続文字列オプション］に「PseudoColumns="*=*";」を入力します。
　　　その他の項目は空白（未入力）で［接続確認］、［保存］を行います。
　　　　![2-6キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/dad7c2cd-ca48-a5c0-eba8-3b4919f1f1d1.jpeg)

　５．ボードからデータを取得できるようにします。
　　　データソース選択で対象のテーブルを選択してもエラーとなりますが、そのまま［OK］をクリックします。
　　　　![2-7キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/fbdd2367-fbef-6c89-2bcd-339da7ce0581.jpeg)
　　　［検索設定］にて、ダミーカラムで定義した項目を［検索項目］に指定して、［値］を「${Authtoken_変数}」と入力します。
　　　　![2-8キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/a0c64329-e0fb-f802-edf5-1d8cacbf62a3.jpeg)
　　　変数「Authtoken_変数」に値を入れるため、ボードに入力アイテムを配置します。
　　　　![2-9キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/2fda8781-1990-9a1d-ee7a-d629b4a6b7a5.jpeg)
　　　アクセルトークンを取得して、上記で作成した入力アイテムに値を入れます。入力後、明細表アイテムをリロードすると値が表示されることを確認します。
　　　　![2-10キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985646/278b93d7-db77-5ab5-ebc8-fd4e393a75e6.jpeg)
### まとめ
もし、ご利用のシステムがRESTfulAPIを使ったWebシステムでJSONデータを返す仕組みがございましたら
専用のCDataのドライバーが無くともCDataのRESTドライバーを利用することで、MotionBoardでデータを可視化することができます。
MotionBoardの連携であきらめていたシステムとの連携がございましたら、ぜひお問合せください。