Salesforce Connector 10.12 の例

データの受け入れと変換

Mule フローは以下をセットアップします。

  • HTTP リスナー: HTTP 要求からデータを受け入れます。

  • メッセージの変換: データの構造と形式を変換し、Salesforce Connector が想定する出力を生成する。

  • Salesforce Connector:

    • (アウトバウンド) Salesforce に接続して、Salesforce にデータを転送する操作を実行します。

    • 設定に従ってフローをトリガーします。

    • Salesforce に接続して、クエリ結果を含む ​InputStream​ を返します。

  • メッセージの変換: データの構造と形式を変換して、File Connector エンドポイントが想定する出力を生成します。

  • File Connector: データをファイル (CSV など) に記録し、ユーザーが定義したディレクトリまたは場所に保存する。

Studio のフロー

  • HTTP リスナーをセットアップし、メッセージを変換して、アカウントを作成します。

    salesforce outbound
  • トリガーをスケジュールし、結果ストリームに対してクエリを実行し、メッセージを変換して、ファイルに書き込みます。

    salesforce inbound

XML フロー

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file"
  xmlns:salesforce="http://www.mulesoft.org/schema/mule/salesforce"
  xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
  xmlns:http="http://www.mulesoft.org/schema/mule/http"
  xmlns="http://www.mulesoft.org/schema/mule/core"
  xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core
  http://www.mulesoft.org/schema/mule/core/current/mule.xsd
  http://www.mulesoft.org/schema/mule/http
  http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
  http://www.mulesoft.org/schema/mule/ee/core
  http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
  http://www.mulesoft.org/schema/mule/salesforce
  http://www.mulesoft.org/schema/mule/salesforce/current/mule-salesforce.xsd
  http://www.mulesoft.org/schema/mule/file
  http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">
  <configuration-properties file="mule-app.properties"/>
  <http:listener-config name="HTTP_Listener_config"
   doc:name="HTTP Listener config" >
  <http:listener-connection host="localhost" port="8081" />
  </http:listener-config>
  <salesforce:sfdc-config name="Salesforce_Sfdc_config"
   doc:name="Salesforce SFDC config">
    <salesforce:basic-connection
    username="${salesforce.username}"
    password="${salesforce.password}"
    securityToken="${salesforce.securityToken}" />
  </salesforce:sfdc-config>
  <flow name="crud_app_template">
    <http:listener config-ref="HTTP_Listener_config"
     path="/" doc:name="Listener" />
    <parse-template location="form.html" doc:name="Parse Template"  />
  </flow>
  <flow name="create_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/createAccount" doc:name="Listener"  />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[{

  Name: payload.Name,
  AccountNumber: payload.AccountNumber,
  BillingCity: payload.BillingCity
}]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:create doc:name="Create" type="Account"
     config-ref="Salesforce_Sfdc_config"/>
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success

}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="delete_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/delete" doc:name="Listener"  />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[payload.Id]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:delete config-ref="Salesforce_Sfdc_config" doc:name="Delete" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="query_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/query" doc:name="Listener"  />
    <salesforce:query config-ref="Salesforce_Sfdc_config" doc:name="Query" >
      <salesforce:salesforce-query>
      SELECT AccountNumber,BillingAddress,Id,Name FROM Account WHERE Name = ':name'
      </salesforce:salesforce-query>
      <salesforce:parameters ><![CDATA[#[output application/java
---
{
  name : payload.name
}]]]></salesforce:parameters>
    </salesforce:query>
    <ee:transform doc:name="Transform Message"  >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
    AccountNumber:$.AccountNumber,
    BillingAddress:$.BillingAddress,
    Id:$.Id,
    Name:$.Name
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="update_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/update" doc:name="Listener"  />
    <ee:transform doc:name="Transform Message"  >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[{

  Name: payload.Name,
  AccountNumber: payload.AccountNumber,
  Id:payload.Id
}]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:update config-ref="Salesforce_Sfdc_config"
     type="Account" doc:name="Update"  />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="upsert_accountFlow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/upsert" doc:name="Listener" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[{

  Name: payload.Name,
  AccountNumber: payload.AccountNumber,
  Id:payload.Id
}]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:upsert config-ref="Salesforce_Sfdc_config"
    externalIdFieldName="Id" type="Account" doc:name="Upsert" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload map {
  id:$.id,
  errors:$.errors,
  success:$.success,
  created:$.created

  }]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="find_duplicates_for_account_flow" >
    <http:listener config-ref="HTTP_Listener_config"
     path="/findDuplicates" doc:name="Listener" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[
  payload
]]]></ee:set-payload>
      </ee:message>
    </ee:transform>
    <salesforce:find-duplicates config-ref="Salesforce_Sfdc_config"
     type="Account"
    doc:name="Find duplicates" />
    <ee:transform doc:name="Transform Message" >
      <ee:message >
        <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
  success: payload.success,
  duplicateResults: {
    (payload.duplicateResults map {
      matchRecords: $.matchResults
    }
    )
  },
  duplicateRuleEntityType: payload.duplicateRuleEntityType,
  duplicateRule: payload.duplicateRule,
  allowSave: payload.allowSave,
  errorMessage: payload.errorMessage
}]]></ee:set-payload>
      </ee:message>
    </ee:transform>
  </flow>
  <flow name="crud-appFlow" >
    <http:listener doc:name="Listener"
     config-ref="HTTP_Listener_config" path="/"/>
    <salesforce:convert-lead doc:name="Convert lead"
     config-ref="Salesforce_Sfdc_config"/>
  </flow>
</mule>

親子リレーションのあるオブジェクトの作成または更新

Salesforce オブジェクトは、オブジェクト間で標準リレーションまたはカスタムリレーションを持つことができます。

オブジェクト間のリレーションは通常一対多の親-子リレーションですが、Salesforce に存在する 2 つのオブジェクトをどのような形でも結び付けることができます。

リレーションが設定されたオブジェクトを作成または変更するのは厄介です。この例は、Salesforce でオブジェクトリレーション構造を作成し、Salesforce Connector を使用してオブジェクトの更新/挿入を実行する方法を示しています。

この例では、2 つのカスタム Salesforce オブジェクト種別を使用します: Componentcc​` と ​Plane​`PlanecPlane__c​ エンティティは環境内に存在している必要があります。

Componentcc​` と ​Plane​`Planec​ オブジェクトは互いにリレーションを持つ必要があり、​Plane__r​ で 2 つのオブジェクト間のリレーションの名前を指定します。

Component__c​ を更新/挿入すると、Salesforce Connector に入力として送信される POJO は次のようになります。

[{
	// Component__c's fields ...
	Plane__r: {
		"type": "Plane__c",
		"Name": "Cobra"
	}
}]

作成する ​Componentcc​` オブジェクトの項目に加えて、親 ​Plane​`Planec​ オブジェクトとのリレーションを ​Plane__r​ 項目で指定する必要があります。

Plane__r​ 項目の値は、2 つの項目が設定されたオブジェクトである必要があります。この例には、次の項目があります。

  • Plane__c​ という名前の参照先オブジェクトを値として持つ ​type​ という名前の項目。

  • 参照する正しいインスタンス ((​Cobra) of `​Plane__c) を識別する値を持つ ​Name​ 項目。

つまり、更新/挿入する ​Componentcc​` には、名前 ​Cobra​ のエンティティ ​Plane​`Planec​ がその親として存在します。

次の XML の例は、これらのオブジェクトを更新/挿入する方法を示しています。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:salesforce="http://www.mulesoft.org/schema/mule/salesforce"
	xmlns:http="http://www.mulesoft.org/schema/mule/http"
	xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/salesforce http://www.mulesoft.org/schema/mule/salesforce/current/mule-salesforce.xsd">
	<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="88f6a4cd-e00a-46c6-b0a0-aaf99fb2dd74" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>
	<salesforce:sfdc-config name="Salesforce_Config" doc:name="Salesforce Config" doc:id="5605405f-3c7b-40d9-bc64-af06ebdfc8dd" >
		<salesforce:basic-connection username="user" password="pass" securityToken="token" />
	</salesforce:sfdc-config>
	<flow name="Copy_of_idp-policy-benefitsFlow" doc:id="e26d68af-d4fb-45f3-9eaa-1f320ffba2b2" >
		<http:listener doc:name="Listener" doc:id="e8014cfd-3af7-43ca-99ef-cd231cda02fd" config-ref="HTTP_Listener_config" path="/" />
		<ee:transform doc:name="Transform Message" doc:id="a0353598-6084-4053-88ab-b2b67ecd4531" >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[{
	Name: "NewPlaneComponent",
	Plane__r: {
		"type": "Plane__c",
		"Name": "Cobra"
	}
}]]]></ee:set-payload>
			</ee:message>
		</ee:transform>
		<salesforce:upsert objectType="Component__c" doc:name="Upsert" doc:id="3bbdcfd6-09a4-43cf-bc75-19fb24ed33b1" config-ref="Salesforce_Config" externalIdFieldName="Id"/>
		<ee:transform doc:name="Transform Message" doc:id="ed6dcb06-ef6a-4332-a715-e2f27498801b" >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
			</ee:message>
		</ee:transform>
	</flow>
</mule>

Invoke APEX Rest Method

Invoke APEX Rest 操作を使用すると、ユーザーは REST サービスとして公開されている Apex クラスからメソッドを呼び出すことができます。次の例は、この操作のペイロードを示しています。

<ee:transform doc:name="Transform Message">
			<ee:message >
				<ee:set-payload ><![CDATA[output application/java
---
{
	body: {
		URLParameters: {
			Parameter1: "parameter1Value",
			Parameter2: "parameter2Value"
		},
		account: {
			Name: "Example",
			AccountNumber: "55"
		}
	},
	headers: {
		header1:"header1Value"
	},
	cookies: {
		cookie1:"cookie1Value"
	},
	queryParameters: {
		queryParam1Name:"queryParam1Value",
		queryParam2Name:"queryParam2Value"
	}
}]]></ee:set-payload>
			</ee:message>
		</ee:transform>

例について説明します。

  • body​ 要素に含まれる ​URLParameters​ は、Apex クラスに記述されている REST リソースのパス内のワイルドカードを置き換えるパラメーターが含まれるマップです。

    たとえば、REST リソースが ​@RestResource(urlMapping='/myResource/\​/mySubResource/​')​ に設定されている場合、​Parameter1​ の値で 1 番目の ​*​ が置き換えられ、​Parameter2​ の値で 2 番目の ​*​ が置き換えられます。

  • キー名は ​Parameter​ で始まり、その後に、置き換える ​*​ の位置を示す数値が続く必要があります。

  • URLParameters​ ブロックの後に、REST リソースに送信する ​body​ 値のコンテンツを指定します (例の ​account​ ブロックを参照)。

  • headers​ および ​cookies​ 項目では、HTTP 要求と共に目的のサービスに渡すヘッダーと Cookie を記述します。

  • queryParameters​ 項目では、使用するクエリパラメーターのほか、指定した Apex クラスで受け入れられる必要があるこのマップ内のキーと値を記述します。