SalesforceからノーコードでAPI Callする?できらぁ!
これはみすてむず いず みすきーしすてむず Advent Calendar 2024の5日目の記事です。
※本記事はGistで書いていたものの移植です。
はじめに
はじめまして、またはおはこんばんちは!えりくしあと申します。
昨年のアドカレでは重てぇ話と辛い話を書いておりました。
いつも猫を愛でたり酒に溺れたりしてるだけのひとなのですが、ここだけの話、Salesforceチョットワカルんです。わたし。
今年こそは技術屋さんぽいことを書いてみたいなぁと思ったので、最近触っててクソわかりづれぇちょっとおもしろかった 「フローを使ってHTTP CallOutをする」 ところを記事にしてみようかなと思います。
想定する読者層
Salesforce?あーなんか営業が使ってるね!なんかいろいろできるんでしょ?くらいの人でも読めるよう書いた・・・つもりです。
Salesforceってなんですか?までは説明していません。
注意事項
本記事は2024年12月現在のSalesforce Developer Editionをもとに執筆しております。
画面項目は今後のmajor updateにより変更される可能性が大いにあります。 ていうか変えろ。
参考リンク
前提: Salesforce フローとは?
フローとは、Salesforceで利用できる自動化プロセスのひとつです。
最大の特徴はノーコードで自動化プロセスが書けるだけでなく、付随する画面やスケジューラ等を実装できること。
・・・とは言うものの、変数や式の概念は存在するので、ユーザ部門が前提知識なしに使うにはちょっと難度が高いのがたまに傷。
何ができるか?のイメージを掴むにはサクセスナビのこちらの記事がわかりやすいかと思います。
Flow vs Others
Salesforceは他にもいくつか自動化を支援する機能が存在します。
各ツールについての比較を 自分で書くのはめんどいので Geminiくんにお願いしてみました。
ApexとはSalesforce Platformの開発で使うJava風のプログラミング言語です。
その他はすべてノーコードツールなので、その中で一番柔軟性が高いかわりに難易度が高いのがフロー、ということになります。
閑話休題: 自動化ツール多すぎ問題
上記の表を見て「同じPlatform上に似たようなツールがなんでこんなにあるんだよ・・・」と思った方、いらっしゃるのではないでしょうか?お目が高いですね。
実はノーコードツール3種(ワークフロールール、プロセスビルダー、フロー)は、右に進むにつれて時代の変化と技術的進歩によって追加されていった機能たちです。
最初はワークフロールールとApexしか存在せず、ノーコードでできたのは「レコード(とその親の特定Field)の作成・変更」をトリガに「自レコードを更新する / メールを送る / ◯日後になんかする」ことしかできませんでした。
そのため、要件に「自レコード"以外"の更新(子レコードとか)」を含む時点でApexで書かざるを得ませんでした。
また、UIも以下のとおり貧弱で、まるで詳細設計書でも書かされているような視認性の悪さも問題でした。
この問題点を解消するため、フローチャートに近いかたちで実装できるプロセスビルダーがリリースされました。
・・・が、これあまり流行らなかったんですよね。私自身も触る機会が少なかったのですが、ワークフロールールと比べたときに「視認性が上がった」以外にできることがたいして増えなかった、のが要因だったんじゃないかなぁ、と思っています。
そうしてプロセスビルダーが普及しきる前に爆誕してしまったのが、今回の記事で取り上げるフローです。名前が紛らわしいのどうにかならんかったのか。
今度は「要素(①)」と「コネクタ(②)」というシンプルな構成要素を組み合わせる形を採用したおかげで、従来の2機能と比べてよりきめ細やかな実装が可能になりつつ視認性を担保できた、と思います。
反面、以前の2機能に比べてやれることが増えすぎて学習コストが上がってしまいましたが・・・。
このように、似たような機能の乱立の背景には、Salesforceの進化の歴史があったわけです。
現在はフローへの移行・統一が推奨されているため、前述の2機能を触ることは(移行案件以外では)今後ないです。
本題: フローからHTTP Requestを送ってみる
大まかに以下の手順で実施します。
- 利用する外部サービスの情報をSalesforceに登録する
- 外部ログイン情報の設定
- 指定ログイン情報の設定
- 権限付与
- フローでHTTP CallOutを作成する
事前準備: GeminiのAPI Keyを取得する
今回はさっきご登場いただいたGeminiくんのAPIを叩くことにしてみます。
Google AI Studio にアクセスし、APIキーを発行しておきます。
(´-`).。oO(支払い情報とかもなくさくっと発行できちゃうんだ・・・)
利用する外部サービスの情報をSalesforceに登録する
Salesforceから外部サービスを利用する場合、「指定ログイン情報」にエンドポイントや認証情報を持っておくのが定石です。
参考: Salesforce で外部サービスを使うときには「指定ログイン情報」を使いましょう
これをやっておくことで、Apexだけでなくフローでも認証まわり等をすっとばして、特定の外部サービスのAPIを叩くところだけの実装に注力できます。
外部ログイン情報を作成
設定 -> セキュリティ -> 指定ログイン情報 -> 外部ログイン情報タブ から 新規
適当に名前をつける。
認証はカスタムで。
(´-`).。oO(基本認証ってなんだと思ったらBasicか。。。)
プリンシパルを作成
ここでのプリンシパル ≒ 外部サービスのユーザ の意味合いっぽい
あとで環境変数的なので呼び出せるっぽいので、APIキーはここでもっておいてみる
カスタムヘッダーを設定
Gemini APIはRestだとヘッダじゃなくてURLパラメータとして持っちゃうみたいなので今回は不要そう
Authorizationとか書く必要あればここに
プリンシパルの情報呼び出しもできる
指定ログイン情報を作成
ここまでやったら 設定 -> セキュリティ -> 指定ログイン情報 まで戻って、指定ログイン情報タブで新規
エンドポイントURLを設定
※ここでさっきのプリンシパルの情報を使えると思ってたんだけど、数式指定してもうまいこといかないので泣く泣くkeyをベタ書きすることにした・・・ぐぅ。。。いったんこの記事の本質じゃないので・・・・。
ここまでで外部サービス呼び出しに必要な情報登録はおしまい
権限付与
外部ログイン情報で指定したプリンシパル(≒ユーザ≒APIキー)を使用できるSalesforceユーザを指定する必要がある
だいたいのdocで権限セットで付与してね!って書いてあるけど、プロファイル単位でも付与可能
今回はシス管全体につけちゃえ
フローでHTTP CallOutを作成する
やっとこフローにたどり着いた。コールアウト書きます。
今回はどっかのレコードページに配置してボタンぽちっとする想定で、画面フローで。
適当な初期画面
つぎにアクションノードを設置して、HTTPコールアウトを作成リンクをクリック
さっき作った指定ログイン情報を指定
Request bodyをサンプルからとってきて突っ込むと、構造解析して入力用の変数としてフロー上に用意してくれる
次は応答サンプル
自分で用意するか、実際にAPI Callしてみてその応答を解析するか選べる
スキーマ用に接続を選択して次へ進むと、入力済みのRequest Bodyサンプルを用いて実際にコールできる
応答が正しく返ってくれば、解析してこちらも出力用変数としてフロー上に用意される
ここまで終わったらフローに戻ってくるので、bodyに指定するリソースを作成する
どうやらさっきの手順でRequest BodyのスキーマをApexコードとして出力してくれているようで、自動でデータ型とクラスが入力済みなので、API参照名(= 変数名)を決めるだけでOK
(´-`).。oO(癖がすごい)
と思いきや、階層が深いやつは階層ぶん変数の用意が必要だった
今回のRequest Bodyは以下の通り
{
"contents": [{
"parts":[{"text": "Explain how AI works"}]
}]
}
ということで階層ごとにそれぞれ準備
ここまで終わったら、画面から受け取った値を使ってbodyを組み立てる
さいごに結果を出力する画面を用意しておしまい
デバッグ!!
フローにはデバッグ機能がついているので、とりあえず動かしてみることができる
質問を入力して
えいや!!!
・・・はい、Responseの分解と整形は力尽きました
おまけ: いいかんじに配置するよ!
Responseの整形まわりと一緒に後日加筆予定
さいごに
フローの書き方自体がだいぶクセ強めで気になるポイントは多いものの、今回紹介したHTTPコールアウト以外にも今までApexでしか実現できなかった機能がどんどん拡充されており結構便利なツールになってきました。
特に簡単な画面を準備してなんかもぞもぞしたい・・・ってときには、ビルダー内でビジネスロジックまで含めてざっと書けちゃう素早さと手軽さはメリットになりうるかなと思うので、ぜひ毛嫌いせず触ってあげてみてください。
余談
簡単にコールできるぞ!ってとこを見せたかったのに、コールするAPI選定で今まで使ったことないGeminiにしちゃったせいで全然関係ないとこでハイパー詰まりました。
まぁ学びがあり面白かったのでワース。
Discussion