Oracle APEXのPrincipal Product ManagerのSalim Hlayelさんが、オラクルの公式ブログに寄稿している記事「What's new in APEX 24.2: REST Data Source Enhancements」にてFlexible Remote Serverとして紹介しています。
以下より、Flexible Remote Serverの使い方を紹介します。
準備として2つのRESTサービスを作成します。
APEXのワークスペースとしてREST1を作成し、サンプル・データセットのEMP/DEPTを、言語として英語を選択してインストールします。
SQLワークショップからRESTfulサービスを開き、ORDSにスキーマを登録します。
左ペインより有効なオブジェクトを選択し、表EMPをAutoRESTが有効なオブジェクトして作成します。認可は不要です。
以下のURLから従業員の一覧を取得することができるようになります。一覧は英語になります。
http://localhost:8181/ords/rest1/emp
APEXのワークスペースとしてREST2を作成し、同様の作業を行い表EMPの一覧を取得できるようにします。ただし、サンプル・データセットのEMP/DEPTは日本語でインストールします。
http://localhost:8181/ords/rest2/emp
一覧は日本語になります。
これらのREST APIを切り替えて呼び出すひとつのリモート・サーバーを作成します。そのリモート・サーバーをソースとした対話モード・レポートのページを作成します。
最初にリモート・サーバーを作成します。
ワークスペース・ユーティリティのリモート・サーバーを開きます。
作成するリモート・サーバーの名前はEMP Sourceとします。サーバー・タイプはRESTデータ・ソースです。
エンドポイントURLとして#proto#://#host#:#port#/ords/#workspace#を記載します。ただし、この値はリモート・サーバーの一覧に表示されるだけのようです。リモート・サーバーのエンドポイントURLは、PL/SQLコードによって生成されます。
最新のAPEXのバージョンでは修正されていますが、以前のバージョンでエンドポイントURLの末尾に/がある場合に発生する不具合がありました。エンドポイントURLの末尾に/を付けない方が安全です。
インストール時にプロンプトを表示はオフにしています。オンにしていると、このアプリケーションを異なるワークスペースにインポートしたときにプロンプトが表示されます。しかし、PL/SQLコードによりエンドポイントURLが決まる形式のリモート・サーバーは、静的IDが同じであれば、ワークスペースが異なっていても同じコードが書かれているべきです。そのため、この設定をオンにするケースはあまり無いでしょう。
静的識別子(静的IDのこと)はEMP_Sourceとし、PL/SQLコードに以下を記述します。p_config.base_urlに与えている文字列に置換文字列として、#proto#、#host#、#port#および#workspace#を含めています。これらを置き換える値をコード中で指定しています。置き換える文字列として、ページ・アイテムP1_PROTO、P1_HOST、P1_PORTおよびP1_WORKSPACEの値を使います。ページ・デザイナでページ番号1を編集している場合は、これらのページ・アイテムの値がセッション・ステートに保存されていると期待できます。しかし、RESTデータ・ソースを作成するときは、これらのページ・アイテムの値は未設定でしょう。そのときに選択されるデフォルト値をNVLで設定しています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
procedure config_remote_server( | |
p_info in apex_plugin.t_remote_server_info | |
,p_config out apex_plugin.t_remote_server_config | |
) | |
is | |
begin | |
p_config.base_url := '#proto#://#host#:#port#/ords/#workspace#'; | |
p_config.substitutions := apex_t_varchar2(); | |
apex_string.plist_put(p_config.substitutions, 'proto', nvl(v('P1_PROTO'),'http')); | |
apex_string.plist_put(p_config.substitutions, 'host', nvl(v('P1_HOST'),'localhost')); | |
apex_string.plist_put(p_config.substitutions, 'port', nvl(v('P1_PORT'),'8181')); | |
apex_string.plist_put(p_config.substitutions, 'workspace', nvl(v('P1_WORKSPACE'),'rest1')); | |
end; |
PL/SQLコードに記述したプロシージャ名config_remote_serverを、構成プロシージャとして設定します。
以上の設定を行い、作成をクリックします。
リモート・サーバーEMP Sourceが作成されます。動的がはいになります。
リモート・サーバーEMP Sourceを使用するAPEXアプリケーションを作成します。
空のアプリケーションを作成します。名前はFlexible Remote Serverとします。
作成済みのRESTデータ・ソースの一覧画面より、作成を実行します。
RESTデータ・ソースの作成はデフォルトの最初からのまま変更せず、次へ進みます。
名前はEmployees、URLエンドポイントとして、あえてhttp://localhost:8181/ords/rest2/empを指定します。このエンドポイントはrest2なので日本語のデータを返します。リモート・サーバーのPL/SQLコードはワークスペースの指定がない場合はrest1、つまり英語のエンドポイントを返します。
次へ進みます。
リモート・サーバーとして先ほど作成したEMP Sourceを選択します。ベースURLはhttp://localhost:8181/ords/rest1になります。サービスURLパスは/empです。
次へ進みます。
英語のデータが一覧されます。選択したリモート・サーバーを対象として、検出が実行されていることが確認できます。
RESTデータ・ソースの作成をクリックします。
RESTデータ・ソースEmployeesが作成されます。エンドポイントURLは、リモートサーバーに定義したエンドポイントURLに/empが付加されます。
リモート・サーバーEMP SourceのエンドポイントURLに含まれるワークスペース名#workspace#を置換するページ・アイテムP1_WORKSPACEを作成します。それ以外の置換文字列はデフォルトを使用し、ページ・アイテムの作成は省略します。
識別の名前はP1_WORKSPACE、タイプは選択リスト、ラベルはWorkspaceとします。設定の選択時のページ・アクションとして値のリダイレクトと設定を選択します。
LOVのタイプに静的値を選択し、静的値の表示値と戻り値のペアとして、English - rest1、Japanese - rest2を設定します。
LOVの追加値の表示はオフです。
詳細の変更されていない変更の警告は無視を選択します。選択リストの値を値のリダイレクトと設定によって切り替える場合、値を変更した後にページがリダイレクトされるため、警告が必ず発生します。ここで無視を設定すると、警告の発生を抑止できます。
リモート・サーバーのコードでページ・アイテムP1_WORKSPACEの値を参照するため、セッション・ステートのストレージはセッションごと(永続)とします。
リージョンを作成します。
識別の名前はEmployeesとし、タイプに対話モード・レポートを選択します。
ソースの位置はRESTソース、RESTソースは先ほど作成したEmployeesを選択します。
以上でアプリケーションは完成です。
アプリケーションを実行して動作を確認します。
Workspaceが空白の場合は、リモート・サーバーはワークスペースとしてデフォルトのrest1を選択します。そのため、レポートの表示は英語になります。
WorkspaceにJapaneseを選択すると、ワークスペースとしてrest2が選択されるため、レポートの表示は日本語に変わります。
WorkspaceにEnglishを選択すると、ワークスペースとしてrest1が選択されるため、レポートの表示は英語に変わります。
以上で、リモート・サーバーのエンドポイントURLが、ページ・アイテムの値によって動的に変更されることが確認できました。
今回の記事は以上です。
簡単なアプリケーションですが、今回作成したアプリケーションのエクスポートを以下に置きました
https://github.com/ujnak/apexapps/blob/master/exports/sample-flexible-remote-server.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完