Invoke apex rest methodを使用したApexクラス呼び出し

スポンサーリンク

今回使うコンポーネント

コンポーネントアイコン・領域用途
Invoke apex rest methodInvoke apex rest methodSalesforceの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を入れていますが、前がリクエスト加工用、後ろがレスポンス加工用となっております。

InvokeApexRestMethodを使用したフロー

前半の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メソッド、戻り値の型も指定する必要があります。

項目設定値備考
Requestpayload前述のTransform Messageの内容
Apex classAccountRestCtrlSalesforce側で作成したREST WebサービスのApexクラス名
Apex Class Method NamedoPost^/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クラスを取得することができます。

FetchAllApexRESTMetadataの設定

この設定はInvoke apex rest methodのApex Class NameとApex Class Method Nameが選択リストとして設定できるので一見便利なんですが、Apex Class Method Nameが誤った形式で設定されてしまうのでおすすめはしません。この状態で実行してもエラーになります。

誤った形で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
MuleSoft
スポンサーリンク

コメント