2022年8月17日水曜日

RESAS APIを呼び出してデータを取得する - その2

2024年10月3日追記

RESAS APIは2025年3月24日で提供が終了します。詳しくは以下のリンクを参照してください。

https://opendata.resas-portal.go.jp/docs/api/v1/index.html

追記終了 


Oracle APEX 22.1の新機能のOracle APEX Data Generatorを使ってみようとしたところ、現状ではサンプル・データは英語のみでした。例えば都道府県や市区町村名をテスト・データとして表に投入するには、元となるデータが必要です。

手作業でサンプル・データを作成するのは大変なので、RESAS APIを呼び出してサンプルのデータ・セットを準備することにしました。RESAS APIの使い方については、以前に記事「RESAS APIを呼び出してデータを取得する」として紹介しています。RESAS APIの利用者登録やAPIキーの取得方法については、こちらの記事を参照してください。

本記事では、RESAS APIを使って、都道府県一覧と市区町村一覧を取得し、それをRESTソース・カタログとして登録するまでの手順について紹介します。


Web資格証明の作成


RESAS APIの利用者登録が済み、APIキーを取得済みとします。Web資格証明はワークスペースに作成します。

アプリケーション・ビルダーワークスペース・ユーティリティを開きます。

Web資格証明を開きます。


作成済みのWeb資格証明が一覧されます。作成をクリックします。


RESAS APIのアクセスに必要な資格証明を作成します。

名前RESASの資格証明静的識別子RESAS_API_KEYとします。認証タイプHTTPヘッダー資格証明名(認証タイプにHTTPヘッダーを選んでいるので、これはヘッダー名です)としてX-API-KEYを指定します。資格証明シークレットとして、RESAS APIに利用者登録を行い取得したAPIキーを入力します。URLに対して有効には、https://opendata.resas-portal.go.jp/api/v1/を指定し、Web資格証明の用途をRESAS APIに限定します。

以上を入力し、作成をクリックします。


ちなみにオープン・データにアクセスできるAPIとして、RESAS APIの他にe-Statがあります。e-Statについては、こちらの記事でAPEXでの使い方を紹介しています。

e-Statが提供しているAPIにアクセスするには、URL問合せ文字列appIdとしてアプリケーションIDを渡す必要があります。e-StatのWeb資格証明の指定は以下のようになります。


Web資格証明としてRESASの資格証明が作成されました。




APEXアプリケーションの作成



RESAS APIにアクセスしてデータを取得するために、RESTデータ・ソースを作成します。RESTデータ・ソースはAPEXアプリケーションの共有コンポーネントなので、RESTデータ・ソースを作成するには、最初にAPEXアプリケーションを作成する必要があります。

とりあえず空のアプリケーションを作成します。

アプリケーション作成ウィザードを起動します。

名前RESASとし、アプリケーションの作成をクリックします。


アプリケーションが作成されました。

今回はアプリケーションの作成が目的ではありません。作業のほとんどは共有コンポーネントにて実施します。




都道府県一覧の取得



都道府県一覧の情報を取得します。RESAS-API一覧より共通都道府県一覧を参照します。ここで、sampleに記載のあるURLに注目します。



共有コンポーネントRESTデータ・ソースを開きます。


登録済みのRESTデータ・ソースが一覧されます。作成をクリックします。


RESTデータ・ソースの作成として最初からを選択します。

へ進みます。


RESTデータ・ソース・タイプとして簡易HTTPを選択します。名前RESAS都道府県一覧とします。URLエンドポイントには、RESAS APIの都道府県一覧のページにsampleとして記載されていたURLを貼り付けます。

へ進みます。


リモート・サーバーベースURLおよびサービスURLパスは自動的に導出されます。変更は不要なので、そのままへ進みます。


ページ区切りタイプとしてページ区切りなしを選択します。

へ進みます。


認証が必要ですONにします。資格証明として、作成済みのRESASの資格証明を選択します。

検出をクリックします。


APIの呼び出しが行われ、取得されたデータが一覧されます。データ・プロファイルをクリックして、認識された列を確認します。


データ・プロファイルを確認します。今回の結果では、列PREFCODEが主キーとして認識されていない点は修正が必要です

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


RESTデータ・ソースRESAS都道府県一覧が作成されました。修正が必要なので、このRESTデータ・ソースを開きます。


最初に詳細静的IDを修正します。静的IDは名前より導出されますが、日本語は使用できないためその部分が_(アンダースコア)になります。このままでは一意にならないため、RESAS_prefecturesに変更し、変更の適用をクリックします。


変更を適用するとRESTデータ・ソースの一覧画面に戻ります。再度、RESTデータ・ソースを開き、今度はデータ・プロファイルの編集をクリックします。


PREFCODE主キーをNoからYesに変更し、変更の適用をクリックします。


変更の適用をクリックします。RESTデータ・ソースの一覧画面に戻るので、再度、編集画面を開きます。画面右の同期化の管理に進みます。


REST同期化詳細同期先として新規表を選択します。表名RESAS_PREFECTURESとします。

表RESAS_PREFECTURESがデータ・プロファイルの設定に従って作成されます。同期化を実行することによりRESAS APIを呼び出して取得したデータが、表RESAS_PREFECTURESに書き込まれます。

保存をクリックします。


表の作成をクリックし、表RESAS_PREFECTURESを作成します。


RESAS APIを呼び出して取得したデータを、表RESAS_PREFECTURESに保存する準備ができました。保存して実行をクリックします。

一度取得したデータを更新する予定は無いので、詳細同期タイプは追加、マージ、置換のどれを選んでも違いはありません。今回は追加を選択しています。


ジョブのステータス実行中となります。ジョブが終了すると、ジョブのステータスの表示が消えます。


ログステータス成功となっていることを確認します。表RESAS_PREFECTURESに保存されているデータを確認するために、SQLワークショップで表示をクリックします。


データ・タブを開き、保存されているデータを確認します。


以上でRESAS APIの都道府県一覧を呼び出し、表RESAS_PREFECTURESに同期することができました。


市区町村一覧の取得



市区町村一覧の情報を取得します。RESAS-API一覧より共通市区町村一覧を参照します。

RESTデータ・ソースの作成方法は、都道府県一覧と同じです。ただし、市区町村一覧はパラメータとして都道府県コードを必要としている点が異なります。

RESAS APIの説明ではprefCodeのRequiredがtrueとなっており、必須パラメータのように見受けられます。ただし、このパラメータを指定していなくてもAPI呼び出しは成功するようです。


市区町村一覧を取得するRESAS APIを呼び出すRESTデータ・ソースを作成します。作成の流れは、すでに都道府県一覧で説明済みなので、市区町村一覧に特化した部分を取り上げます。

RESTデータ・ソースの名前RESAS市区町村一覧とします。URLエンドポイントとして、sampleにあるURLをそのまま貼り付けます。

以降の操作は、都道府県一覧を同じです。


市区町村一覧のデータ・プロファイルを確認します。列CITYCODE主キーとして認識されていないので、これは後で修正します。

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


RESTデータ・ソースRESAS市区町村一覧を開きます。

詳細静的IDRESAS_citiesに変更します。また、データ・プロファイルの編集を開き、CITYCODE主キーYesに変更します。


データ・プロファイルの列CITYCODE主キーYesにします。


パラメータですが、prefCode必須いいえになっています。RESAS APIのWebページではRequiredはtrueですから、本来は必須はいであるべきです。

パラメータprefCode鉛筆アイコンをクリックします。


パラメータが無くてもAPI呼び出しは成功するようですが、ドキュメントの記述に従い詳細必須ONに変更します。変更の適用をクリックします。


以上でRESAS APIの市区町村一覧を呼び出すRESTデータ・ソースの作成は完了です。

同期化の管理を呼び出します。

新規に作成する同期化表の表名RESAS_CITIESとします。

これ以降は都道府県一覧と同じ操作を行い、表RESAS_CITIESにデータを同期させます。


同期化が完了しSQLワークショップより表RESAS_CITIESのデータを確認すると、列PREFCODE1のデータのみが同期していることが確認できます。

RESTデータ・ソースRESAS市区町村一覧prefCodeのデフォルト値がであり、その呼び出しのみが行われているため、このような結果になります。市区町村一覧をすべて同期するには、47都道府県のコードをprefCodeとして与え、47回同期化を実行する必要があります。


prefCodeに都道府県コードを指定し47回同期化を繰り返すために、自動化を使用します。

共有コンポーネント自動化を開きます。


作成済みの自動化が一覧されます。作成をクリックします。


名前RESAS市区町村一覧とします。一度だけ実行すればよい処理なので、タイプとしてオンデマンドを選択します。アクションの開始として問合せを選択します。

へ進みます。


 データ・ソースとしてローカル・データベースソース・タイプとしてSQL問合せを選択します。SQL SELECT文を入力として、以下を記述します。

select prefcode from resas_prefectures

アクションの実行時間として行が返されるを選択します。実行時間となっていますが、行が返されたときに実行される、という意味で時間とは関係ありません。ここで返される行は47行になり、47回アクションが実行されます。

作成をクリックします。


自動化RESAS市区町村一覧が作成されます。

名前静的IDに日本語は含められないため、静的IDRESAS-citiesに変更し変更の保存を行います。

続いて、アクション鉛筆アイコンをクリックして編集します。


アクションでは、パッケージAPEX_REST_SOURCE_SYNCのDYNAMIC_SYNCHRONIZE_DATAを呼び出します。

アクションの名前同期に変更します。タイプコードを実行コードの位置ローカル・データベース言語PL/SQLコードとして以下を記述します。


コード中でバインド変数としてPREFCODEを使用しています。このバインド変数には、自動化のソースのSELECT文で取得されているPREFCODEが割り当てられます。

変更の適用をクリックします。


以上で自動化の作成は完了です。

保存して実行をクリックします。


自動化実行ログを確認します。ステータス成功で、成功した行47になります。


同期化の結果を確認します。SQLワークショップSQLコマンドより、以下のSELECT文を実行してみます。

select * from resas_cities where bigcityflag = 1 order by prefcode

PREFCODEが1、つまり北海道のbigCityFlagが1の市区町村については、APEX$SYNC_STEP_STATIC_IDが空白になっています。これはRESTデータ・ソースを作成したときに同期化が実行されているためです。自動化による同期化では、すでに同じデータがあるためスキップされています。



RESTソース・カタログの作成



RESTデータ・ソースはアプリケーションに作成します。公開されているREST APIへのアクセスであれば、他のアプリケーションからも使用できると便利です。

作成したRESTデータ・ソースをアプリケーションで共有するため、Oracle APEX 21.2より、RESTソース・カタログが導入されています。RESTソース・カタログを作成し、今まで作成したRESASのRESTデータ・ソースをRESTソース・カタログに保存します。

ワークスペース・ユーティリティRESTソース・カタログを開きます。


RESTソース・カタログが未構成の場合、最初にカタログ・グループの作成を要求されます。

グループの作成をクリックします。


カタログ・グループの名前Open Data Japanとします。作成をクリックします。


カタログ・グループが作成されました。続いてカタログの作成をクリックします。


グループとしてOpen Data Japanを選択します。名前RESAS内部名RESASとします。エンドポイントURLのリフレッシュは、まだ作成したRESTデータ・ソースをエクスポートしていないため、指定はしません。

作成をクリックします。


RESTソース・カタログRESASが作成されます。まだ、コンテンツ0サービスです。


作成済みのRESTデータ・ソースを開き、カタログに保存をクリックします。


カタログ・グループOpen Data Japanを選択し、カタログとしてその中のRESASを選択します。

カタログに保存をクリックします。


作成済みのRESTデータ・ソースがRESTソース・カタログに保存されます。アプリケーション側で加えた変更をRESTソース・カタログに保存する、または、更新されたRESTソース・カタログにてリフレッシュできるようになります。


作成済みのRESTデータ・ソースをすべてRESTソース・カタログに保存しておきます。


RESTソース・カタログのエクスポートとインポート



作成したRESTソース・カタログのエクスポートとインポートが可能です。

ワークスペース・ユーティリティRESTソース・カタログを開きます。画面右のカタログのエクスポートを実行します。


RESTソース・カタログとしてRESASを選択し、エクスポートを実行します。RESTソース・カタログがSQLファイルRESAS.sqlとしてダウンロードされます。


エクスポートされたファイルを、共有できる場所に配置します。今回はGitHubに配置しました。

https://raw.githubusercontent.com/ujnak/apexapps/master/exports/RESAS.sql

ワークスペース・ユーティティRESTソース・カタログを開きます。RESASのエンドポイントURLとして、上記のURLを設定します。


エンドポイントURLのリフレッシュとしてURLを設定し、変更の適用をクリックします。


ワークスペースに新規にRESTソース・カタログを導入するには、カタログのインポートを実行します。


インポート作業では、ファイル・タイプとしてRESTソース・カタログが選択されます。インポート・ファイルとして、エクスポートされたRESTソース・カタログのSQLファイルを選択します。


RESTデータ・ソースはRESTソース・カタログによって共有できますが、それを呼び出している自動化は含まれません。

自動化はAPEXアプリケーションに作成されています。APEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/resas-sample-app.zip

以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

追記

共通の特許.技術分野のデータにtecCodeとtecNameが空白のデータが含まれます。これはsampleにも含まれています。


このデータのため、データ・プロファイルでtecCodeを主キーにすると、同期化ができません。主キーを設定せず、データを同期化表RESAS_PATENTS_BROADに取り込んだ後にtecCodeがnullの行を削除する必要がありました。