[OutSystems]GetEntryEspaceName/Id()の動作を確認する


OutSystemsで、Actionの呼び出し元を取得する方法として、組み込み関数のGetEntryEspaceNameとGetEntryEspaceIdというものがあります。

関数名が示唆する通り、ユーザーのリクエストの起点となるモジュールの名前やIDを返すものです。
残念ながら、起点となるモジュールと関数呼び出しの間に別のモジュールが挟まる場合、中間のモジュールを知ることはできないようです。

確認環境

Personal Environment(Version 11.13.0 (Build 31107))
Service Studio (Version 11.12.0)

まとめ

組み込み関数のGetEntryEspaceName/GetEntryEspaceIdは、ユーザーがリクエストを直接行うモジュールの名前/Idを返す。間に別のモジュールのServer Actionを経由しても同じ。

ただし、間にService ActionやREST APIを挟んだ場合は、そちらのモジュールの名前/Idを返す。

確認するAPIについて

Built-in Functionに含まれる以下のAPIを試してみます。
ドキュメント - Built-in Functions > Environment

GetEntryEspaceName

Webリクエストを処理しているモジュールの名前を返します。

と言う仕様です。リクエストの起点となるモジュールのNameプロパティの値が帰ってくる。

GetEntryEspaceId

Webリクエストを処理しているモジュールの識別子を返します。

が仕様。リクエストの起点となるモジュールのIdが返ってくる。このIdは(System)モジュール > Espace EntiryのIdプロパティの値。

APIを呼び出すActionの実装 (テスト用Action)

以上のAPIを以下の式で利用し、結果を返すActionを実装。
2つのAPIを順番に呼び、結果を改行で区切る形で整形しています。

"GetEntryEspaceId(): " + GetEntryEspaceId() + NewLine() +
"GetEntryEspaceName(): " + GetEntryEspaceName()

基本:ユーザーがリクエストした画面のモジュールが返る

Reactive Web Appの画面でリクエストして、Producerモジュールで関数呼び出しをすると、画面が所属しているモジュールの名前とIdが取れます。

以下の構成のモジュールを作って動作確認してみました。
各四角形がモジュールを示しています。結果として、いずれの場合でもConsumerモジュールの値が返ってきました。

①別モジュールのServer Action経由でテスト用Actionを呼ぶ場合

(Screen Action > Producer1モジュールのServer Action > Producer2モジュールのテスト用Action)
結果。Screen Actionが所属するモジュール名/Idが返ってきている。

GetEntryEspaceId(): 224
GetEntryEspaceName(): Consumer

②同モジュールのServer Action・別モジュールのServer Action経由でテスト用Actionを呼ぶ場合

(Screen Action > Consumerモジュールの別のServer Action > Producer1モジュールのServer Action > Producer2モジュールのテスト用Action)
結果は以下の通り。Screen Actionが所属するモジュール名/Idが返ってきている。

GetEntryEspaceId(): 224
GetEntryEspaceName(): Consumer

③別モジュールのClient Action経由でテスト用Actionを呼ぶ場合

(Screen Action > Producer1モジュールのClient Action > Producer2モジュールのテスト用Action)
結果。Screen Actionが所属するモジュール名/Idが返ってきている。ここはちょっと意外ですね。Webリクエストとのことなので、Server Action呼び出しになる部分が返ってくるかと思いきや、最初のConsumerモジュールの部分が返ってきました。

GetEntryEspaceId(): 224
GetEntryEspaceName(): Consumer

Service Actionを経由する場合

①と同じパターンで、Producer1のServer Actionの代わりにService Actionを経由させてみます。
この場合、Service Actionは、内部的にREST APIなので、Service Action呼び出しの部分が呼び出しの起点とみなされるのではないかという考えから。

以下が結果。想定通り、Service Actionが起点とみなされ、Service Actionが所属するモジュールが返ってきています。呼び出し元のReactive Web Appでないことに注意が必要です。

GetEntryEspaceId(): 587
GetEntryEspaceName(): Producer1

Expose REST APIを経由する場合

①と同じパターンで、Producer1のServer Actionの代わりにExpose REST APIを経由させてみます。Service Actionと同じ結果になることが想定されます。

以下が結果。想定通り、Expose REST APIが起点とみなされ、REST APIが所属するモジュールが返ってきています。呼び出し元のReactive Web Appでないことに注意が必要です。

GetEntryEspaceId(): 587
GetEntryEspaceName(): Producer1