NocoBaseワークフローで外部APIのレスポンスを扱う

2024.04.30

こんにちは、栁澤です。
今回はNocoBaseワークフローで外部のAPIを叩き、そのレスポンスを取り扱ってみます。

困っていたこと

ワークフロー標準のHTTPリクエストノードでは外部のAPIにリクエストを送ることは出来ますが、そのレスポンスを利用することができません。

今回は、「JSON query」ノードを組み合わせて、入力されたメールアドレスを元にSlackAPI: lookupByEmailを叩き、そのレスポンスから必要な情報を取得・抽出し、コレクションに登録してみます。

どう対応すればいいの?

Plugin: workflow-json-queryを有効にする

商用プラグインであるworkflow-json-queryを有効にします。
こちらのプラグインを使うには商用プラグインライセンスを購入する必要があります。

コレクションを用意する

結果の登録先となるコレクションを用意します。

SlackのIDを主キーとし、メールアドレス・ユーザー名を格納するSlackIDsコレクションを用意しました。

ワークフローを構築する

ワークフロー: Slackユーザー情報取得を作成します。

今回はUI上のボタンを押した際に起動するようにしたいため、トリガータイプはPost-action event
同期実行である必要はないためExcute modeはAsynchronouslyを選択します。

ワークフローを作成したら編集ボタンを押して早速中身のノードを構築していきます。

既にトリガーノードが用意されていますので、まずはトリガーノード: Slackユーザー情報取得の設定をします。

トリガーノードの設定では、ワークフロー開始時にどのようなデータが渡ってくるか指定します。
このワークフローはSlackIDsコレクションを元にしたフォームから起動しますので、SlackIDsコレクションを選択します。

トリガーノードの編集が済んだら次のノードを作成します。
トリガーノードの下につながっている丸い+アイコンをクリックし、ノードを追加します。
SlackAPI: lookupByEmailにリクエストを送信するため、「HTTP request」 ノードを作成します。

作成したHTTP requestノードがSlackAPIを叩けるよう設定していきます。
基本的にはSlackのAPIドキュメント通りに設定しますが、Parameter: emailはトリガー時に渡されたデータを利用するため下記のように設定します。

次は「JSON query」ノードを作成します。
JSON queryノードでは、下記3種類のJSONクエリ言語を利用できます。

  • JMESPath
  • JSON Path Plus
  • JSONata

今回はJMESPathを利用してデータを抽出します。
JMESPathを詳しく知りたい方はこちらの記事をご覧ください。

ノードの設定は下記のとおりです。

Data sourceには、「ノードの結果 / HTTP request」を選択します。
Query expressionは、レスポンスからID, 名前を抽出しますので下記のように指定します。

{"id": user.id, "real_name": user.real_name}

Properties mappingは、抽出したJSONオブジェクトの値を後続のノードで使えるよう下記画像の通りマッピングします。

最後にこれまでのノードで得た結果を登録する「レコード追加」ノードを作成します。

下記の通り、登録するコレクション、フィールド値を設定します。
ID, nameはJSON queryノードの結果、emailはトリガー時のデータをそのまま登録します。

フォームを用意する

ワークフローに渡す値を入力し、起動するフォームを作成します。
今回は下記のように、メールアドレスの入力欄と「Submit to workflow」ボタンを配置します。

送信ボタンは通常の「送信」ボタンではなく、「Submit to workflow」ボタンを配置します。
送信ボタンですとコレクションのバリデーションが走ってしまい、下記UIだと主キーである「ID」が入力されていない(できない)ため押下時にエラーとなってしまいます。

配置した「Submit to workflow」ボタンの編集メニューから「Bind workflows」メニューを開き、先程作ったワークフローを割り当てます。

実践

フォーム下に「SlackIDs」コレクションのテーブルを配置し、そちらから結果を確認します。

下記画像がフォームフィールド: emailへメールアドレスを入力し、ワークフローを呼び出した結果です。
SlackのID, 名前がSlackAPIから取得され、無事登録されています。