2021年11月11日木曜日

Oracle APEX 21.2新機能(12) - REST関連の拡張

 Oracle APEX 21.2より利用できるようになったRESTサービスの機能として、以下の2つがあります。

  1. RESTソース・カタログ
  2. 簡易HTTPでのページ区切りの対応
これらの新機能を使ったアプリケーションを作成してみます。アプリケーションは政府統計の総合窓口e-Statが提供しているREST APIを呼び出して、統計データを取得します。


e-StatのREST APIを呼び出すにはアプリケーションIDが必要です。e-Statのユーザー登録を行い、あらかじめアプリケーションIDを取得します。



RESTデータ・ソースの作成


e-Statが提供するAPIの仕様書が公開されています。この中の統計表情報取得メタ情報取得統計データ取得の3つのAPIをOracle APEXのRESTデータ・ソースとして作成します。

APEX側で扱いやすい応答の書式はJSONなので、すべてJSONを返すようにAPIを呼び出します。仕様書を理解すればRESTデータ・ソースを作ることはできますが、とても大変です

Oracle APEX 21.2よりRESTソース・カタログが新設され、作成済みのRESTデータ・ソースをインポートできるようになりました。 RESTソース・カタログワークスペース・ユーティリティに含まれています。

e-StatのREST APIを呼び出すRESTデータ・ソースの定義をインポートします。RESTソース・カタログをクリックして開きます。

最初にカタログ・グループを作成します。グループの作成をクリックします。

カタログ・グループの名前、説明は任意ですが、今回は名前OpenData Japan説明日本のオープンデータとします。作成をクリックします。

カタログ・グループが作成されると、RESTデータ・カタログの画面に戻ります。一般的な操作であれば、カタログ・グループの作成のためのダイアログが閉じると、カタログ・グループの一覧画面に戻るはずなのですが、RESTソース・カタログではそうなっていません。

カタログの作成をクリックします。

グループには先ほど作成したOpenData Japanを選択します。名前e-Stat内部名ESTATAPI、説明は任意です。エンドポイントURLのリフレッシュには、GitHubに置いてあるエクスポートされたRESTソース・カタログのSQLファイルを指定します。以下のURLになります。

https://raw.githubusercontent.com/ujnak/apexapps/master/exports/estat-api.sql

上記を設定し、作成をクリックします。


RESTソース・カタログe-Statが作成されます。コンテンツの0サービスをクリックします。


今のところRESTソース・カタログが作成されただけなので、内容は空です。右端のタスクに含まれるカタログのリフレッシュをクリックします。


リフレッシュの実施を確認するダイアログが開きます。カタログのリフレッシュをクリックします。


カタログがリフレッシュされ、SQLファイルに定義されていた統計表情報取得メタ情報取得統計データ取得の3つのRESTデータ・ソースがインポートされます。


以上でAPEXのアプリケーションから、このRESTデータ・カタログを元にしたRESTデータ・ソースが作成できるようになりました。

今回はSQLファイルをGitHubに配置しています。RESTデータ・ソースの定義に変更があり、SQLファイルが更新された場合は、RESTソース・カタログを再度リフレッシュすると更新が反映されます。その際に、すでにアプリケーションに作成済みのRESTデータ・ソースは影響を受けません。更新されたRESTソース・カタログの定義を作成済みのRESTデータ・ソースに反映するには、RESTデータ・ソースも別にリフレッシュする必要があります。

カタログのリフレッシュのリンクの上にカタログのエクスポートのリンクがあります。こちらはワークスペース・ユーティリティエクスポートへのリンクとなっています。Oracle APEX 21.2より、エクスポートの対象としてカタログ(RESTソース・カタログ)が追加されています。

ここでRESTソース・カタログを選んでエクスポートを実行すると、RESTデータ・ソースの定義が含まれるSQLファイルが生成されます。


RESTソース・カタログとなるSQLファイルは、先程のエンドポイントURLのリフレッシュとして指定することも、アプリケーションなどと同様の手順にてインポートすることもできます。

インポートするファイルのファイル・タイプとして、RESTソース・カタログが新設されています。


手元にSQLファイルがある場合は、インポートの機能を使ってRESTソース・カタログをインポートします。

RESTデータ・ソースの作成


アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前は任意ですが、ここではe-Stat APIとしています。


アプリケーションが作成されたら、共有コンポーネントWeb資格証明を開きます。あらかじめ、e-StatのAPIを呼び出すためのアプリケーションIDをWeb資格証明として作成します。


Web資格証明の一覧画面の作成をクリックします。


Web資格証明名前e-Stat静的識別子ESTATとします。e-StatのREST APIの認証タイプURL問合せ文字列になります。資格証明名(URL問合せ文字列の場合はパラメータ名)はappIdです。資格証明シークレットとして、e-Statにユーザー登録をして取得したアプリケーションIDの文字列を入力します。URLに対して有効は以下とし、それ以外のURLへの呼び出しではこの資格証明を使用できなくします。

https://api.e-stat.go.jp/rest/3.0/

作成をクリックします。


e-StatのAPIの呼び出しに使用するWeb資格証明e-Statが作成されました。


続いてRESTデータ・ソースを作成します。作成したアプリケーションの共有コンポーネントRESTデータ・ソースを開きます。


RESTデータ・ソースの一覧より作成をクリックします。


RESTデータ・ソースの作成として、RESTソース・カタログからを選択します。へ進みます。


RESTソース・カタログに含まれているメタ情報取得統計データ取得統計表情報取得を選択し、へ進みます。


Web資格証明として先ほど作成したe-Statを選択します。RESTデータ・ソースの作成を行います。


RESTソース・カタログを元にしたRESTデータ・ソースが作成されました。


これで、e-Statをデータ・ソースとして扱うことができるようになりました。

統計表一覧画面の作成


e-StatがAPI経由で提供している統計表を一覧する画面を作成します。RESTデータ・ソースの一覧より統計表情報取得を開きます。


RESTデータ・ソースとしての設定内容を確認します。設定のセクションがOracle APEX 21.2で追加されたページ区切りに関する設定です


e-StatのREST APIでのページ区切りタイプページ・サイズフェッチ・オフセットです。ページ・サイズを指定するページ・サイズURLパラメータlimitです。e-StatのAPI呼び出しで取得できるデータ数の最大は10万とのことですが、ページ・サイズ最大には10000を指定しています。行オフセットURLパラメータstartPositionです。行オフセット・タイプとしてフェッチする最初の行を選んでいます。パラメータとして読み飛ばすデータ数を指定する場合は行オフセット・タイプスキップする行を選びます。

ページ区切りタイプにはこれ以外に、ページ区切りなしページ・サイズとページ番号ページ番号があります。

e-StatのREST APIはその他の行セレクタとして指定できる

GET_STATS_LIST.DATALIST_INF.RESULT_INF.NEXT_KEY

や、合計行セレクタも応答となるJSONに含まれているため、追加で設定しています。

GET_STATS_LIST.DATALIST_INF.NUMBER

その他、APIの仕様に従ってデータ・プロファイルを設定しています。


RESTデータ・ソースとして37の列が定義されています。


主にデータの絞り込みを行うために使用できる11のパラメータが設定されています。


RESTソース・カタログのセクションでは、RESTデータ・ソースでの変更をカタログに反映させるカタログに保存のボタンと、その逆にカタログの変更をRESTデータ・ソースに反映させるカタログからのリフレッシュのボタンが追加されています。

RESTソース・カタログが追加されたため、RESTデータ・ソースについてはサブスクリプションの機能を使うことは少なくなるでしょう。

RESTデータ・ソース名前が日本語であるため静的IDが適切に生成されていません。静的IDとしてESTATTABLEを設定します。静的IDを設定し、変更の適用をクリックします。


RESTデータ・ソース統計表情報取得同期化の管理を開きます。


同期化を構成します。同期先新規表を選び、表名としてESTAT_TABLESを入力し、保存をクリックします。


表の作成をクリックします。RESTデータ・ソースのデータ・プロファイルを元に表の定義が決められます。


表が作成されて同期化の準備が完了します。e-Statからは18万を超える統計表が提供されており、一回のREST APIの呼び出しでは全体を取得することはできません。Oracle APEX 21.2では簡易HTTPでもページ区切りをサポートしたため、内部的に複数のREST APIの呼び出しを行い、すべてのデータを取得できるようになりました。

保存して実行をクリックすると、統計表のデータの取得が開始します。環境に依存すると思いますが、1回のリクエストの処理(10000のデータの取り出し)に1分程度の時間がかかりました。そのためデータ全体の取得には20分程度の時間がかかりました。

ステップの追加を行い、必要な統計表に絞り込んでデータを取得することが望ましいです。


ジョブのステータス実行中になります。同期化の処理はバックグラウンドで行われるため、この時点でREST同期化のページから離れることができます。


REST APIの呼び出し状況を確認します。ワークスペース・ユーティリティOracle APEXビューを開きます。


ビュー一覧よりAPEX_WEBSERVICE_LOGを探します(スクリーンショットでは、WEBSを検索しています)。APEX_WEBSERVICE_LOGを開きます。


全ての列を選択し、結果をクリックして表示します。


URLのパラメータのstartPositionを1, 10001, 20001, ... と変えていきながら連続してREST APIが呼び出されていることが確認できます。startPositionが18001の呼び出しが最後の呼び出しになります。


同期化が終了したら、統計表を一覧する対話モード・レポートのページを作成します。アプリケーション・ビルダーよりページ作成ウィザードを起動します。


レポートを選択します。


対話モード・レポートを選択します。


ページ名統計表一覧とし、へ進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選びます。へ進みます。


データ・ソースとしてRESTデータ・ソースを選択し、RESTデータ・ソース統計表情報取得を選びます。列はすべて選択し、作成をクリックします。


ページが作成されたら、ページを実行する前に必ず、対話モード・レポート統計表一覧のプロパティ同期化表の使用ONに変更します

RESTデータ・ソース統計表情報取得をそのまま対話モード・レポートのデータ・ソースとして使用すると、実用にならないほどレスポンスは悪いし、また、e-Stat側にも無駄に負荷をかけることになります。


同期化表を使うようにプロパティを変更してページを実行すると、以下のようになります。


これまでの説明でOracle APEX 21.2のREST関連の拡張については、すべて紹介されています。少し説明が長くなってきたので、最初のGIF動画にある統計データの表示については、記事を分けて紹介しようと思います。