このエントリは2023/06/22現在の情報に基づいています。将来の機能追加や変更に伴い、記載内容からの乖離が発生する可能性があります。
いつもとは違う人から、次のような問い合わせが届いた。
問い合わせ
いま、Logic Appsでワークフローを作成しているが、リクエストで渡ってくるJSONのJSONスキーマが数種類ほどあり、どのスキーマに基づいたJSONが届くかわからない。そのため、リクエスト受信時ではなく、必要なタイミングでパースし、各スキーマ固有の処理をしたいが、どうすればよいか?
リクエストで到達するJSONのスキーマが数種類あり、リクエスト受信時に特定のスキーマ決め打ちでパースしても例外が発生するので、なんとかしたい、ということのよう。
どうすればよいか?
リクエストを受け取ったタイミングではスキーマ検証はせず、Parse JSONアクションを使って必要なデータを取得すればよい。スキーマが複数あるなら、並行処理させることも可能。
やってみる
実際に実装例を紹介する。今回はConsumption SKUを使っているが、Standard SKUでも同じ実装が可能。フローの方針は以下の通り。なお、今回は2種類のスキーマに基づいたデータが送信される前提で構成している。
- リクエストはOpaqueデータとして受け取っておく
- Parse JSONアクションを使い、必要なデータを各スキーマで取得する(スキーマが数種類あるとのことなので、並列でParse JSONアクションを実行してもよい)
- 取得した値で処理を分岐(もし文字列なら、文字列長で該当データの有無を判断できる)
って流れで実装したのがこちら。

以後で各フェーズについて説明する。
[1] HTTPリクエスト受信時
下図のように、JSONスキーマは指定しないでおく。

[2] Parse JSONを実行
スキーマが数種類あるとのことなので、並列でParse JSONアクションを実行し、Parseした結果を変数A、Bに設定している(いずれも文字列)。

スコープ失敗時(例えば、HTTPリクエスト本体が空っぽだった場合)にも処理を継続するよう、後続のInitialize response messageアクションのrunAfterプロパティを構成している。

[3] リクエストデータごとにデータ処理を分岐
どのスキーマに基づいたデータかを変数A、Bで判断できるので、Aがあるとき、Bがあるとき、などの形で分岐する。今回はテスト目的なので変数に値を設定しているだけである。

この条件分岐に失敗したとしても応答を返すよう、後続のResponseアクションのrunAfterプロパティを構成している。

これで完了。
テスト
実際に動作確認してみる。特定のスキーマに基づいたメッセージを送ると、当該メッセージからスキーマを識別できるような要素を取得できる。さらに、リクエストメッセージなしでPOSTしても、エラーが返る。

実行履歴を確認すると、両スコープで失敗しているものの、runAfterプロパティを構成していたおかげで、エラーメッセージを返すように動作していることがわかる。
