2025年1月23日木曜日

リモート・サーバーのエンドポイントURLをアプリケーション実行中に動的に変更する

Oracle APEX 24.2ではリモート・サーバーのエンドポイントURLを、アプリケーションの実行中に動的に変更することができるようになりました。

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にスキーマを登録します。

左ペインより有効なオブジェクトを選択し、表EMPAutoRESTが有効なオブジェクトして作成します。認可は不要です。


以下の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_PROTOP1_HOSTP1_PORTおよびP1_WORKSPACEの値を使います。ページ・デザイナでページ番号1を編集している場合は、これらのページ・アイテムの値がセッション・ステートに保存されていると期待できます。しかし、RESTデータ・ソースを作成するときは、これらのページ・アイテムの値は未設定でしょう。そのときに選択されるデフォルト値をNVLで設定しています。


PL/SQLコードに記述したプロシージャ名config_remote_serverを、構成プロシージャとして設定します。

以上の設定を行い、作成をクリックします。


リモート・サーバーEMP Sourceが作成されます。動的はいになります。


リモート・サーバーEMP Sourceを使用するAPEXアプリケーションを作成します。

空のアプリケーションを作成します。名前Flexible Remote Serverとします。


アプリケーションが作成されたら、共有コンポーネントRESTデータ・ソースを開きます。


作成済みのRESTデータ・ソースの一覧画面より、作成を実行します。


RESTデータ・ソースの作成はデフォルトの最初からのまま変更せず、へ進みます。


Oracle REST Data Servicesの機能であるAutoRESTによるエンドポイントURLを呼び出すため、RESTデータ・ソース・タイプOracle REST Data Servicesを選択します。

名前EmployeesURLエンドポイントとして、あえてhttp://localhost:8181/ords/rest2/empを指定します。このエンドポイントはrest2なので日本語のデータを返します。リモート・サーバーのPL/SQLコードはワークスペースの指定がない場合はrest1、つまり英語のエンドポイントを返します。

へ進みます。


リモート・サーバーとして先ほど作成したEMP Sourceを選択します。ベースURLhttp://localhost:8181/ords/rest1になります。サービスURLパス/empです。

へ進みます。


認証が必要ですオフにし、検出をクリックします。


英語のデータが一覧されます。選択したリモート・サーバーを対象として、検出が実行されていることが確認できます。

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


RESTデータ・ソースEmployeesが作成されます。エンドポイントURLは、リモートサーバーに定義したエンドポイントURLに/empが付加されます。


ページ・デザイナホーム・ページを開きます。

リモート・サーバーEMP SourceエンドポイントURLに含まれるワークスペース名#workspace#を置換するページ・アイテムP1_WORKSPACEを作成します。それ以外の置換文字列はデフォルトを使用し、ページ・アイテムの作成は省略します。

識別名前P1_WORKSPACEタイプ選択リストラベルWorkspaceとします。設定選択時のページ・アクションとして値のリダイレクトと設定を選択します。

LOVタイプ静的値を選択し、静的値表示値戻り値のペアとして、English - rest1Japanese - 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のアプリケーション作成の参考になれば幸いです。