Microsoft Dynamics 365 Connector 2.6 の例

デモプロジェクトを構築して実行すると、Microsoft Dynamics 365 Connector の理解を深めることができます。

始める前に

このデモプロジェクトを構築して実行するには、以下が必要です。

  • Mule 4.0 以降の Anypoint Studio。

  • Microsoft Dynamics 365 Connector v1.0.0 以降。

  • Microsoft Dynamics 365 (CRM 8.2)

Mule フローの概要

以下の例には、次の ​<flow>​ 要素が含まれます。

  • CREATE_EMPTY_CONTACT_DEMO
    後で他のフローで必要になる空の取引先責任者エンティティを作成します。
    [GET] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/createContact

  • CREATE_EMPTY_OPPORTUNITY_DEMO
    後で他のフローで必要になる空の商談エンティティを作成します。
    [GET] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/createOpportunity

  • CREATE_ACCOUNT_DEMO
    指定された属性を使用して取引先を作成し、さらに取引先を取引先責任者に関連付けます。
    [POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/createAccount​ = 要求の例: {"AccountName":"Test Account Name","CreditOnHold":true,"CreditLimit":1000,"ContactID":"<ID>"}

  • CREATE_MULTIPLE_ENTITIES_DEMO
    1 つのバッチ要求で同じ種別のエンティティを複数作成します。
    [POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/createMultipleAccounts
    要求の例: [{"AccountName":"Account Name 1","CreditOnHold":true,"CreditLimit":1500},{"AccountName":"Account Name 2","CreditOnHold":false,"CreditLimit":2000}]

  • UPDATE_MULTIPLE_ENTITIES_DEMO
    1 つのバッチ要求で同じ種別のエンティティを複数更新します。
    [POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/updateMultipleAccounts
    要求の例: [{"EntityId":"<ID>","AccountName":"Updated Name 1"},{"EntityId":"<ID>","AccountName":"Updated Name 2"}]

  • DELETE_ENTITY_DEMO
    指定された種別のエンティティを削除します。
    [POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/deleteAccount
    要求の例: {"EntityId":"<ID>"}

  • RETRIEVE_ENTITY_DEMO
    指定された種別のエンティティを取得します。
    [POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/retrieveAccount
    要求の例: {"EntityId":"<ID>"}

  • RETRIEVE_ENTITIES_BY_URL_DEMO
    URL 要求に基づいて複数のエンティティを取得します。
    [GET] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/retrieveAccountsByURL

  • RETRIEVE_ENTITIES_BY_QUERY_DEMO
    DataSense クエリ言語に基づいて複数のエンティティを取得します。
    [GET] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/retrieveAccountsByQuery

  • DISASSOCIATE_ENTITIES_DEMO
    エンティティの関連付けを解除します。要求を実行するエンティティの ID と関連付けを解除するキーを指定します。
    [POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/disassociateEntities
    要求の例: {"EntityId":"<ID>","EntityLinkKeys":["primarycontactid"]}

  • DO_ACTION_DEMO
    WinOpportunity​ アクションをコールします。
    [POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/doAction
    要求の例: {"Subject":"Won Opportunity","Status":3,"OpportunityId":"<OP_ID>"}

http://localhost:8081​ を参照してフローをテストするか、curl のようなツールや、URL のコール時にボディの POST を実行できる他のツール (Chrome/Mozilla Firefox の拡張機能) を使用して JSON の POST を実行できます。

フローをテストする

  1. /src/main/resources/mule-artifact.properties で、OAuth2 ユーザー名/パスワード設定の OAuth2 ログイン情報を指定します。

    • config-oauth-user-pass.username​ セッションを初期化するユーザー名

    • config-oauth-user-pass.password​ ユーザーの認証に使用するパスワード

    • config-oauth-user-pass.resource​ Web API のアプリケーション ID URI (セキュアなリソース)。CRM バージョンを指定しない、ルート URI である必要があります (例: https://<your-org>.crm2.dynamics.com/​)。

    • config-oauth-user-pass.clientId​ アプリケーションを Azure Active Directory に登録したときに割り当てられたアプリケーション ID。この ID は Azure Portal で確認できます。

    • config-oauth-user-pass.clientSecret​ アプリケーション登録ポータルでアプリケーション用に作成したアプリケーションシークレット。クライアントシークレットは信頼のおける方法でデバイスに保存できないため、シークレットをネイティブアプリケーションで使用しないでください。シークレットは Web アプリケーションと Web API で必要です (クライアントシークレットをサーバー側で安全に保存できます)。

    • config-oauth-user-pass.tokenRequestEndpoint​ アクセストークンを取得するためにコールされるトークンエンドポイント。例: https://login.windows.net/<tenant-id>/oauth2/token​。この場合の「tenant-id」は Azure Active Directory ID です。

  2. コネクタは DataSense 情報を提供するために複数の要求を実行するので、DataSense 接続タイムアウトは 200 秒より長く指定します。

  3. Studio でプロジェクトを実行します。

  4. ブラウザーで ​localhost:8081​ と入力し、デモの選択メニューにアクセスします。

  5. 必要に応じて、[Connection Timeout (接続タイムアウト)] と [Read Timeout (読み取りタイムアウト)] を設定します。 [Connection Timeout (接続タイムアウト)] は、サーバーに初めて接続するときのタイムアウトです。 [Read Timeout (読み取りタイムアウト)] は、サーバーからのデータの読み取りを待機するときのタイムアウトです。

Mule XML フロー

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

<mule xmlns:dynamics="http://www.mulesoft.org/schema/mule/dynamics"
	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/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/http
http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/core
http://www.mulesoft.org/schema/mule/core/current/mule.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/dynamics
http://www.mulesoft.org/schema/mule/dynamics/current/mule-dynamics.xsd">

	<configuration-properties file="mule-artifact.properties" />
	<http:listener-config
        name="HTTP_Listener_config"
        doc:name="HTTP Listener config" >
		<http:listener-connection
            host="0.0.0.0"
            port="8081" />
	</http:listener-config>
	<dynamics:dynamics-config
        name="Dynamics_365_config"
        doc:name="Dynamics 365 Dynamics 365"  >
		<dynamics:oauth-user-pass-connection
            username="${config-oauth-user-pass.username}"
            password="${config-oauth-user-pass.password}"
			resource="${config-oauth-user-pass.resource}"
            clientId="${config-oauth-user-pass.clientId}"
			clientSecret="${config-oauth-user-pass.clientSecret}"
            tokenRequestEndpoint="${config-oauth-user-pass.tokenRequestEndpoint}" />
	</dynamics:dynamics-config>
	<flow name="PARSE_DEMO_TEMPLATE">
        <http:listener
            config-ref="HTTP_Listener_config"
            doc:name="HTTP"
            path="/"/>
        <parse-template
            location="form.html"
            doc:name="Parse Template"/>
    </flow>
    <flow name="CREATE_EMPTY_CONTACT_DEMO">
        <http:listener
            config-ref="HTTP_Listener_config"
            path="/createContact" doc:name="HTTP"/>
        <logger message="Requested 'Create Contact Operation'"
            level="INFO" doc:name="Logger"/>
		<dynamics:create config-ref="Dynamics_365_config"
            logicalName="contact" doc:name="Microsoft Dynamics 365">
			<dynamics:attributes ><![CDATA[#[{}]]]></dynamics:attributes>
		</dynamics:create>

        <logger message="#['Received Response from &quot;Create Contact Operation&quot;:' ++ payload]" level="INFO" doc:name="Logger"/>
    </flow>
    <flow name="CREATE_EMPTY_OPPORTUNITY_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/createOpportunity" doc:name="HTTP"/>
        <logger message="Requested 'Create Opportunity Operation'"
            level="INFO" doc:name="Logger"/>
		<dynamics:create config-ref="Dynamics_365_config"
            logicalName="opportunity" doc:name="Microsoft Dynamics 365">
			<dynamics:attributes ><![CDATA[#[{}]]]></dynamics:attributes>
		</dynamics:create>
        <logger message="#['Received Response from &quot;Create Opportunity Operation&quot;: ' ++ payload]" level="INFO" doc:name="Logger"/>
    </flow>
    <flow name="CREATE_ACCOUNT_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/createAccount" doc:name="HTTP"/>
        <logger message="Requested 'Create Account Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Transform Message">
            <ee:message>
            	<ee:set-payload>
            <![CDATA[%dw 2.0
output application/java
---
{
	name: payload.AccountName,
	creditonhold: payload.CreditOnHold,
	creditlimit: payload.CreditLimit,
	"primarycontactid@odata.bind": "/contacts(" ++ payload.ContactID ++ ")"
}]]></ee:set-payload>
			</ee:message>
		</ee:transform>
        <dynamics:create config-ref="Dynamics_365_config"
            logicalName="account" doc:name="Microsoft Dynamics 365">
            <dynamics:attributes>#[payload]</dynamics:attributes>
        </dynamics:create>
        <logger message="#['Received Response from &quot;Create Account Operation&quot; : ' ++ payload]" level="INFO" doc:name="Logger"/>
    </flow>
    <flow name="CREATE_MULTIPLE_ENTITIES_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/createMultipleAccounts" doc:name="HTTP"/>
        <logger message="Requested 'Create Multiple Accounts Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Transform Message">
            <ee:message>
            	<ee:set-payload><![CDATA[%dw 2.0
input payload application/json
output application/java
---
payload map {
      name: $.AccountName,
      creditlimit : $.CreditLimit,
      creditonhold : $.CreditOnHold
}]]></ee:set-payload>
			</ee:message>
        </ee:transform>
        <dynamics:create-multiple config-ref="Dynamics_365_config"
            logicalName="account" doc:name="Microsoft Dynamics 365">
            <dynamics:entities-attributes>#[payload]</dynamics:entities-attributes>
        </dynamics:create-multiple>
        <logger message="Received Response from 'Create Multiple Entities Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Response to JSON"  >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
			</ee:message>
		</ee:transform>
    </flow>
    <flow name="UPDATE_ENTITY_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/updateAccount" doc:name="HTTP"/>
        <logger message="Requested 'Update Entity Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Transform Message">
            <ee:message>
            	<ee:set-payload><![CDATA[%dw 2.0
output application/java
---
{
	entityId: payload.EntityId,
	attributes: {
		creditlimit: payload.CreditLimit,
		name: payload.AccountName
	}
}]]></ee:set-payload>
			</ee:message>
        </ee:transform>
        <dynamics:update config-ref="Dynamics_365_config"
            logicalName="account" doc:name="Microsoft Dynamics 365">
            <dynamics:attributes>#[payload]</dynamics:attributes>
        </dynamics:update>
        <logger message="'Update Entity Operation' has ended with success"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Response to JSON"  >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
			</ee:message>
		</ee:transform>
    </flow>
    <flow name="UPDATE_MULTIPLE_ENTITIES_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/updateMultipleAccounts" doc:name="HTTP"/>
        <logger message="Requested 'Update Multiple Entities Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Transform Message">
            <ee:message>
            	<ee:set-payload><![CDATA[%dw 2.0
input payload application/json
output application/java
---
payload map {
	entityId: $.EntityId,
	attributes: {
		name: $.AccountName
	}
}]]></ee:set-payload>
			</ee:message>
        </ee:transform>
        <dynamics:update-multiple config-ref="Dynamics_365_config"
            logicalName="account" doc:name="Microsoft Dynamics 365">
            <dynamics:entities-attributes>#[payload]</dynamics:entities-attributes>
        </dynamics:update-multiple>
        <logger message="Received Response from 'Update Multiple Entities Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Response to JSON"  >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
			</ee:message>
		</ee:transform>
    </flow>
    <flow name="DELETE_ENTITY_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/deleteAccount" doc:name="HTTP"/>
        <logger message="Requested 'Delete Entity Operation'"
            level="INFO" doc:name="Logger"/>
        <dynamics:delete config-ref="Dynamics_365_config"
            logicalName="account" doc:name="Microsoft Dynamics 365">
			<dynamics:id>#[payload.EntityId]</dynamics:id>
		</dynamics:delete>
        <logger message="'Delete Entity Operation' has ended with success"
            level="INFO" doc:name="Logger"/>
    </flow>
    <flow name="RETRIEVE_ENTITY_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/retrieveAccount" doc:name="HTTP"/>
        <logger message="Requested 'Retrieve Entity Operation'"
            level="INFO" doc:name="Logger"/>
        <dynamics:retrieve config-ref="Dynamics_365_config"
            logicalName="account" doc:name="Microsoft Dynamics 365">
			<dynamics:id>#[payload.EntityId]</dynamics:id>
		</dynamics:retrieve>
        <logger message="Received Response from 'Retrieve Entity Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Response to JSON"  >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
			</ee:message>
		</ee:transform>
    </flow>
    <flow name="RETRIEVE_ENTITIES_BY_URL_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/retrieveAccountsByURL" doc:name="HTTP"/>
        <logger message="Requested 'Retrieve Multiple Operation'"
            level="INFO" doc:name="Logger"/>
        <dynamics:retrieve-multiple config-ref="Dynamics_365_config"
            doc:name="Microsoft Dynamics 365">
        	<dynamics:data-query-url>${config-oauth-user-pass.resource}/api/data/v8.2/accounts?$select=name,accountnumber&amp;$top=3</dynamics:data-query-url>
        </dynamics:retrieve-multiple>

        <logger message="Received Response from 'Retrieve Multiple Operation'"
            level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Response to JSON" >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
			</ee:message>
		</ee:transform>
    </flow>
    <flow name="RETRIEVE_ENTITIES_BY_QUERY_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/retrieveAccountsByQuery" doc:name="HTTP"/>
        <logger message="Requested 'Retrieve Multiple By Query Operation'"
            level="INFO" doc:name="Logger"/>
        <dynamics:retrieve-multiple-by-query
            config-ref="Dynamics_365_config" doc:name="Microsoft Dynamics 365">
        	<dynamics:query>dsql:SELECT accountid,accountnumber,name FROM accounts LIMIT 2</dynamics:query>
        </dynamics:retrieve-multiple-by-query>

        <logger message="Received Response from 'Retrieve Multiple By Query Operation'"
            level="INFO" doc:name="Logger"/>
		<ee:transform doc:name="Response to JSON">
			<ee:message>
				<ee:set-payload><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
			</ee:message>
		</ee:transform>
    </flow>
    <flow name="DISASSOCIATE_ENTITIES_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/disassociateEntities" doc:name="HTTP"/>
        <logger level="INFO" doc:name="Logger"
            message="Requested 'Disassociate Entities Operation'"/>
        <ee:transform doc:name="Transform Message">
            <ee:message>
            	<ee:set-payload><![CDATA[%dw 2.0
output application/java
---
{
	entityId: payload.EntityId,
	attributes: payload.EntityLinkKeys
}]]></ee:set-payload>
			</ee:message>
        </ee:transform>
        <dynamics:disassociate config-ref="Dynamics_365_config"
            logicalName="account" doc:name="Microsoft Dynamics 365">
            <dynamics:attributes>#[payload]</dynamics:attributes>
        </dynamics:disassociate>
        <logger level="INFO" doc:name="Logger"
            message="Finished 'Disassociate Entities Operation' with success"/>
    </flow>
    <flow name="DO_ACTION_DEMO">
        <http:listener config-ref="HTTP_Listener_config"
            path="/doAction" doc:name="HTTP"/>
        <logger message="Requested 'Do Action Operation'"
            level="INFO" doc:name="Logger"/>

		<ee:transform doc:name="Transform Message">
            <ee:message>
            	<ee:set-payload><![CDATA[%dw 2.0
output application/java
---
{
	OpportunityClose: {
		subject: payload.Subject,
		"opportunityid@odata.bind": "/opportunities(" ++ payload.OpportunityId ++ ")"
	},
	Status: payload.Status
}]]></ee:set-payload>
			</ee:message>
        </ee:transform>
        <dynamics:do-action config-ref="Dynamics_365_config"
            actionName="WinOpportunity" doc:name="Microsoft Dynamics 365"/>
        <logger message="Finished 'Do Action Operation'"
            level="INFO" doc:name="Logger"/>
    </flow>
</mule>

エンティティを更新する

  1. Microsoft Dynamics 365 Update 操作を追加します。

  2. 必須の論理名 (小文字のスキーマの名前) を指定します。

  3. デフォルトの省略可能な属性を定義します。エンティティ ID は、更新するエンティティインスタンスを示す必須属性です。

例: エンティティの更新

指定された属性を使用して取引先を更新します。

[POST] HTTP エンドポイントは次の URL をリスンします。​http://localhost:8081/updateAccount

要求の例

{"EntityId":"<ENTRY_ID>","AccountName":"Updated Name","CreditLimit":1500}

フロー定義

<flow name="UPDATE_ENTITY_DEMO">
    <http:listener
    	config-ref="HTTP_Listener_config"
	path="/updateAccount"
	doc:name="HTTP"/>
    <logger
    	message="Requested 'Update Entity Operation'"
	level="INFO"
	doc:name="Logger"/>
    <ee:transform doc:name="Transform Message">
        <ee:message>
            <ee:set-payload><![CDATA[%dw 2.0
            output application/java
            ---
            {
                entityId: payload.EntityId,
                attributes: {
                    creditlimit: payload.CreditLimit,
                    name: payload.AccountName
                }
            }]]>
            </ee:set-payload>
        </ee:message>
    </ee:transform>
    <dynamics:update
    	config-ref="Dynamics_365_config"
	logicalName="account"
	doc:name="Microsoft Dynamics 365">
        <dynamics:attributes>#[payload]</dynamics:attributes>
    </dynamics:update>
    <logger
    	message="'Update Entity Operation' has ended with success"
	level="INFO"
	doc:name="Logger"/>
    <ee:transform doc:name="Response to JSON" >
        <ee:message>
            <ee:set-payload><![CDATA[%dw 2.0
            output application/json
            ---
            payload]]>
            </ee:set-payload>
        </ee:message>
    </ee:transform>
</flow>