外部システムと連携する機能の実装は、Salesforce に限らずよくありますが、連携先の Web API が利用できない、または利用できても自由が効かない場面に遭遇したことがある方は少なくないでしょう。このとき、一般の Web 開発であれば、例えば Mockoon のようなツールを使ってローカルにサーバを立てて開発を進めたりといった手段が取れます。しかし、Salesforce のようにローカルでの開発・テストが難しい場合、同じ方法は取れません。ローカルではなく Web 上でいい感じに固定値を返してくれる API が簡単に用意できれば、フローや Apex からのコールアウトのようなシステム連携を含む Salesforce プラットフォーム上の開発をスムーズに進められそうです。
この記事では、Salesforce 上に Apex REST を用いてAPI モックを作る方法を紹介します。既存で類似の Web サービスに例えば Mocky などがありますが、今回の方法は、レスポンスを静的リソース内の JSON ファイルとして管理するなど、Salesforce 開発者が慣れ親しんでいるであろう方法で易しく設定・管理できることを目的にしています。
ソースコード
機能の構成
設定手順
-
上記リポジトリの
mock-web-service
フォルダのメタデータをデプロイしますsf project deploy start --source-dir mock-web-service
-
モック API レスポンスとなる、任意の JSON ファイル群を zip にして任意の名前で静的リソースに保存します
-
カスタムメタデータ
Mock Web Service Setting
にレコードを追加します。このカスタムメタデータでは、リクエストのパスに対応するレスポンスの静的リソース・JSON ファイルと、ステータスコードを設定することができます。リクエスト URI項目は、Apex REST で定義しているパスである/mock
から始めてください
例えば上記のように設定した場合、
https://yourdomain.my.salesforce.com/services/apexrest/mock/user/0001
は、静的リソースMockApiResponse
内のexample01.json
の内容を返却するようになります。
zip 化された静的リソースは、ローカルの Salesforce DX プロジェクトでは通常のフォルダとファイルとして扱えます。レスポンスを直接変更したい場合は、コードと同様にローカルでファイルを修正してデプロイすると良いでしょう。
指定ログイン情報を用いて Salesforce から API モックをコールする
これまでの設定で Salesforce 上にAPI モックを用意することができました。続いて、Apex からこれにコールアウトしてみましょう。リポジトリにはサンプルのアプリケーションも含めていますので、それをデプロイして試していただくこともできます。また、API モックとそれをコールアウトする機能は同一組織に置くこともできます。
-
認証プロバイダを作成します。プロバイダタイプは
Salesforce
に、コンシューマー鍵とコンシューマの秘密は、先の手順でデプロイした資源に外部クライアントアプリケーションApex Mock Web Service
があるので、このコンシューマー鍵とコンシューマーの秘密の値を設定してください。保存後、表示されるコールバックURL を、外部アプリケーションのコールバック URL に設定します
-
外部ログイン情報を作成します。指定ログイン情報の画面から新しく外部ログイン情報を作成します。認証プロトコルは
OAuth 2.0
、認証フローはブラウザフロー
、認証プロバイダで直前に作成した認証プロバイダを選択します。scope にはapi web refresh_token
を入れておきましょう。
-
プリンシパルを作成します。同じ画面の中ほどから、任意の名前でプリンシパルを作成します。続いて指定ログイン情報を作成します。ログインユーザに応じた分岐はないので、ID種別は
指定ユーザ
にします。アクションから認証
をクリックします。apex-mock-webservice
をデプロイした組織ログインし、アクセスを許可してください
-
続いて、指定ログイン情報を作成します。URL は、Apex REST の URL を設定します。外部ログイン情報欄は、直前に設定した外部ログイン情報を指定してください
-
権限セットを作成し、外部情報プリンシパルアクセスから、3. で作成したプリンシパルを利用可能にします。この権限セットをユーザに割り当てることでコールアウトできるようになります
-
これでようやく API モックを叩く準備が整いました。サンプルの Apex コードを作成します。
Mock Web Service Setting
カスタムメタデータで設定したパスをエンドポイントに設定してみましょう。指定ログイン情報を使用したエンドポイントの設定は、setEndPoint('callout:指定ログイン情報名/パス')
という書き方になりますHttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setEndpoint('callout:ApexMockWebService/user/0001'); HttpResponse res = (new Http()).send(req); System.debug(res.getBody()); // 対応する JSON ファイルがレスポンスになるはず
対応する JSON ファイルの内容がレスポンスとして得られるはずです。実際の API が利用できるようになっても Apex コードの変更は不要で、指定ログイン情報や外部ログイン情報の設定を実際の API に合わせればOKです。(とすると手順の指定ログイン情報の命名はあまり良くないのですが、ご容赦を)
おわりに
比較的簡単な手順で固定値を返す API を作成し Salesforce からコールすることができました。レスポンスのファイルは別に必ずしも zip にしなくても良いのですが、JSON ファイルが多くなると *.resource-meta.xml
ファイルが煩わしいので…。ぜひ試してみてください!