今回使うコンポーネント
コンポーネント | アイコン・領域 | 用途 |
---|---|---|
Invoke apex rest method | SalesforceのREST Webサービスを呼び出す |
今回の目的
- Salesforce側でカスタムREST WebサービスをApexクラスで作成
- Mule側で作成したREST Webサービスを呼び出し結果を取得する
ApexクラスでREST Webサービスを作成
まずはSalesforce側でREST Apexクラスを作成します。REST Webサービスを実装するには@RestResourceアノテーションとHttpメソッドに対応したアノテーションを使用します。今回はPOSTメソッドとして実行するため、@HttpPostを使用します。
以下のコードを実装して、doPostメソッドで取引先を取得し、結果をレスポンスに返すメソッドを作成します。
@RestResource(urlMapping='/accountctrl')
global class AccountRestCtrl {
@HttpPost
global static void doPost() {
// リクエストとレスポンスを取得
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
List<Account> result = [SELECT Id, Name FROM Account Limit 5];
// レスポンスにステータスコードと検索結果を入れる
res.statusCode = 200;
res.responseBody = Blob.valueOf(JSON.serialize(result));
}
}
Mule側の設定
Muleから作成したREST Webサービスを呼び出すには、Invoke apex rest methodコンポーネントを使用します。
フローを以下のように組み立てます。Invoke apex rest methodの前後にTransform Messageを入れていますが、前がリクエスト加工用、後ろがレスポンス加工用となっております。
前半のTransform MessageはInvoke apex rest methodのリクエストに設定するJSONを作成します。今回は使用しないため、以下のように空のJSONを設定します。
%dw 2.0
output application/json
---
{
}
後半のTransform MessageはInvoke apex rest methodから返却されたレスポンスをJSON化します。一旦、payloadをそのままJSON化します。
%dw 2.0
output application/json
---
payload
Invoke apex rest methodは以下のように設定します。ちょっと難しいのがApex Class Method Nameでメソッド名だけでなく、エンドポイントのURI、Httpメソッド、戻り値の型も指定する必要があります。
項目 | 設定値 | 備考 |
---|---|---|
Request | payload | 前述のTransform Messageの内容 |
Apex class | AccountRestCtrl | Salesforce側で作成したREST WebサービスのApexクラス名 |
Apex Class Method Name | doPost^/accountctrl^HttpPost^void | 左から順にメソッド名、URI、Httpメソッド、戻り値のデータ型を設定、区切り文字に「^」を使う |
これでREST Webサービスを呼び出す準備ができました。実際に実行してみましょう。
{
"doPostOutput": [
{
"attributes": {
"type": "Account",
"url": "/services/data/v58.0/sobjects/Account/0015h00000ZUbuAAAT"
},
"Id": "0015h00000ZUbuAAAT",
"Name": "テスト1"
},
(中略)...
{
"attributes": {
"type": "Account",
"url": "/services/data/v58.0/sobjects/Account/0015h00000VzxLdAAJ"
},
"Id": "0015h00000VzxLdAAJ",
"Name": "テスト5"
}
]
}
このように取引先を取得することができました。Invoke apex rest methodから返ってきたレスポンスは、取引先のリストがダイレクトに入ってくる訳ではなく、doPostOutputという内容の中に結果が返ってくるという点がポイントです。ここでいう、doPostOutputは「メソッド名+”Output”」という名前で返され、「Output」部分は固定となります。
注意点
Fetch All Apex REST Metadataの罠
Salesforce ConfigのApexタブにあるFetch All Apex REST MetadataをTrueにすると、接続先のSalesforce環境からREST WetサービスのApexクラスを取得することができます。
この設定はInvoke apex rest methodのApex Class NameとApex Class Method Nameが選択リストとして設定できるので一見便利なんですが、Apex Class Method Nameが誤った形式で設定されてしまうのでおすすめはしません。この状態で実行してもエラーになります。
Apex Class Method Nameは手入力で設定するようにしましょう。
Invoke apex rest methodのレスポンス
Invoke apex rest method後のTransform Messageには嫌でもdoPostOutputが付いてきます。レスポンスを取得する場合は、以下のようにpayloadにdoPostOutputまで指定した形で取ってくるといいでしょう。
%dw 2.0
output application/json
---
payload.doPostOutput
コメント