OutSystemsの画面上に表形式のUIを表示するData Gridコンポーネントだが、Traditional Web版もある。
Traditional Webは使われなくなってきているだろうが、今更ながら、Data GridのTWA向けコンポーネントのチュートリアルを試し、気づいたことをメモしておく。
チュートリアル:How to use OutSystems Data Grid Web
環境情報
Personal Environment(Version 11.23.0 (Build 39357))
Service Studio(Version 11.54.24)
OutSystems Data Grid Web (Version 2.21.4)
新しい環境ではTraditional Webは作成できない
Forum投稿:I can't see Create Traditional Web Application optionに以下のように書かれている通り、新しい環境ではTraditional Webのアプリケーションを作成するオプションが無効になっている。
For new paid licences, the template for Traditional Web is by default no longer installed/enabled.
この解決策として、サポートへの依頼が挙げられている(試したことないので、実際にやってくれるかは不明)。
You can request to OutSystems, to enable the Traditional Web App template again for you. You can request this through a support case.
ちなみに、Traditional Webが有効になっている環境では、アプリケーション作成時に以下のように「Traditional Web」というオプションが表示される。
Module名が変更されている
チュートリアル中では、コンポーネントのModule名が「DataGridComponent」とされているが、現バージョンをインストールして確認すると、以下の通り「OutSystemsDataGridWeb」となっている。
開発方法の大きな違い:サーバーデータにアクセスするためにExpose REST APIを使う
Reactive Web Appであれば、自然にクライアント側からのリクエスト(Data ActionやScreenのAggregateなど)によってサーバーのデータを取得できる。
しかし、Traditional Webの場合はそうもいかず、Expose REST APIを作成してデータ取得する。Data GridのコンポーネントにURLを設定すると、動作時にリクエストを行って、結果をGrid内に表示してくれる。
Expose REST APIの認証問題
問題は、作成した画面とExpose REST APIのMethod間では認証が共有されないこと。
画面に配置したData GridからExpose REST APIを呼ぶとき、認証クッキーは渡っているようだが、ログインセッションは共有されない。つまり、Anonymousユーザーによるアクセス扱いになってしまう。
そのままだとAPIにセキュリティがかからないので、画面にログイン中のユーザーIdを取得するActionが提供されている。
それがData Grid Webアプリケーション/DataGridAuthentication Extension。
ExtensionにあるGetUserLogged Actionがログイン中のユーザーIdを返してくれる。
ただし、恐らくこのActionが内部で使っている以下のAPI呼び出しはAPIドキュメントが見当たらないので、非公開のもの。
OutSystems.RuntimePublic.Session.GetUserFromSessionCookie();
DataGridAuthentication/GetUserLogged Actionの動作確認してみる
以下のように、Data Gridから呼んでいるExpose REST APIロジック内で、GetUserId()とGetUserLogged Actionそれぞれの結果をログに出力してみる。
結果は以下の通り。
GetUserId(): 0 GetUserLogged.UserId: 2
GetUserId()=0=NullIdentifier()なので、OutSystemsの通常ロジックとしては未ログインの状態。
しかし、GetUserLogged Actionは正しく呼び出し元画面にログインしているユーザーのIdを返している。