Microsoft Dynamics 365 コネクタ

Select

Anypoint Platform 用の Microsoft Dynamics 365 コネクタを使用すると、Microsoft Dynamics 365 Web API とのインテグレーションが可能になります。

このコネクタでは、次の操作を実行できます。

  • サーバアクセスの承認または承認の取り消しを行う。

  • エンティティを作成、更新、削除する。

  • 単一エンティティの取得または複数エンティティのクエリを行う。

  • エンティティの関連付けまたは関連付けの解除を行う。

  • アクションを実行する。

前提条件

このドキュメントは、読者が Mule、Anypoint コネクタ、Anypoint Studio の基礎、Mule フローの要素、グローバル要素に精通していることを前提としています。

Microsoft Azure Active Directory ポータル (portal.azure.com) にログインして、アプリケーションのクライアント ID とシークレットを取得します。

開始前:

  • Azure Active Directory が利用する Microsoft Dynamics 365 インスタンス (オンラインまたはオンプレミス) へのアクセス権が必要です。つまり、Azure Active Directory がアプリケーションへのアクセスを可能にする ID プロバイダになります。

コネクタの用語について

  • アクション - データの変更など副次的な影響を可能にする操作。非確定的な動作を回避するためにさらなる構成はできません。

  • 複合型 - 一連のプロパティからなるキーのない名前付き構造化型。複合型は一般に、モデルエンティティのプロパティ値、あるいは操作のパラメータや戻り値として使用されます。

  • エンティティ - エンティティ種別 (account、opportunity など) のインスタンス。

  • エンティティセット - エンティティの名前付きコレクション (たとえば、account は account エンティティを含むエンティティセットです)。エンティティのキーでエンティティセット内のエンティティを一意に識別します

  • エンティティ種別 - キーのある名前付き構造化型。エンティティ種別は、エンティティの名前付きプロパティとリレーションを定義し、1 つの継承によって他のエンティティ種別から派生させることができます。

  • 列挙型または Enum 型 - 基本的な整数値を名前付き定数とする名前付きプリミティブ型。

  • 関数 - 副次的な影響のない操作。追加の絞り込み操作、関数、アクションなどによるさらなる構成をサポートできます。

コネクタのインストールおよび設定方法

  1. Anypoint Studio で、Studio タスクバーの Exchange アイコンをクリックします。

  2. Anypoint Exchange で [Login (ログイン)] をクリックします。

  3. コネクタを検索して [Install (インストール)] をクリックします。

  4. 画面の指示に従ってコネクタをインストールします。

Studio の更新がある場合、右下隅にメッセージが表示されます。メッセージをクリックすると、更新をインストールできます。

Anypoint Studio ビジュアルエディタを使用して Mule プロジェクトを新規作成する方法

  1. Anypoint Studio で、[File (ファイル)] > [New (新規)] > [Mule Project (Mule プロジェクト)] をクリックします。

  2. プロジェクト名を指定して、[Finish (完了)] をクリックします。

  3. 「http」を検索し、HTTP コネクタをキャンバスにドラッグします。[Connector Configuration (コネクタ設定)] の横にある緑のプラス記号をクリックし、メニューで [OK] をクリックしてデフォルト値を受け入れます。

  4. 「365」を検索し、Microsoft Dynamics 365 コネクタをキャンバスにドラッグします。 [Connector Configuration (コネクタ設定)] の横にある緑のプラスをクリックし、アクセスログイン情報を指定します。

  5. 認証の接続戦略をクリックします。

    • Microsoft Dynamics 365 OAuth 2.0 接続

    • Microsoft Dynamics 365 OAuth 2.0 ユーザ名パスワード

OAuth 2.0 接続の設定方法

この接続によって Microsoft Dynamics 365 Web API へのアクセスが可能になります。

OAuth 2.0 ユーザ名パスワードの設定方法

  1. [Connector Configuration (コネクタ設定)] の右にある緑のプラス記号をクリックします。

  2. 次のログイン情報を入力すると、Microsoft Dynamics 365 サーバにアクセスできます。

    • [General (一般)] タブ

      • Client ID (クライアント ID) - アプリケーションを Azure Active Directory に登録したときに割り当てられたアプリケーション ID。この ID は Azure Portal で確認できます。[Active Directory] をクリックして、ディレクトリをクリックし、アプリケーションを選択してから [Configure (設定)] をクリックします。

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

      • Username - Username used to initialize the session.

      • Password - Password used to authenticate the user.

      • Resource (リソース) - Web API のアプリケーション ID URI (セキュアなリソース)。CRM バージョンを指定しない、ルート URI である必要があります。https://YOUR_ORG.crm.dynamics.com/ のような形式です。

      • Token Request Endpoint (トークン要求エンドポイント) - アクセストークンを取得するためにコールするトークンエンドポイント。https://login.windows.net/TENANT_ID/oauth2/token のような形式で、TENANT_ID は Azure Active Directory ID です。

    • [Advanced (詳細)] タブ

      • Read Timeout (読み取りタイムアウト) - コンシューマが応答を待機する時間 (ミリ秒単位)。この時間を経過するとタイムアウトします。ゼロにした場合は永続的に待機します。

      • Connection Timeout (接続タイムアウト) - コンシューマが接続確立を試行する時間 (ミリ秒単位) を指定します。この時間を経過するとタイムアウトします。ゼロにした場合は永続的に待機します。

  3. [Test Connection (接続をテスト)] をクリックして、サーバエンドポイントでログイン情報が受け入れられることを確認します。

  4. [Enable DataSense (DataSense の有効化)] がある場合はクリックして、アプリケーションがサーバからメタデータを取得できるようにします。

フローの実行方法

  1. Package Explorer で、プロジェクトの名前を右クリックし、[Run As (別のユーザとして実行)] > [Mule Application (Mule アプリケーション)] をクリックします。

  2. アプリケーションの起動時にコンソールを確認します。エラーが発生していない場合、次のようなメッセージが表示されます。

************************************************************
INFO  2017-05-14 22:12:42,003 [main] org.mule.module.launcher.DeploymentDirectoryWatcher:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Mule is up and kicking (every 5000ms)                    +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INFO  2017-05-14 22:12:42,006 [main] org.mule.module.launcher.StartupSummaryDeploymentListener:
**********************************************************
*  - - + DOMAIN + - -               * - - + STATUS + - - *
**********************************************************
* default                           * DEPLOYED           *
**********************************************************

************************************************************************
* - - + APPLICATION + - -   * - - + DOMAIN + - -  * - - + STATUS + - - *
************************************************************************
* myapp                     * default             * DEPLOYED           *
************************************************************************

例: Microsoft Dynamics 365

この例では、Microsoft Dynamics 365 コネクタの使用について説明します。

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

  • Mule 4.0 Runtime 以上を備えた Anypoint Studio

  • Microsoft Dynamics 365 コネクタ v2.0.0 以降

  • Azure Active Directory が利用する Dynamics 365

フローのテスト方法

  1. Anypoint Exchange を使用するか、[File (ファイル)] メニューの [Import] コマンドを使用して、デモプロジェクトをワークスペースにインポートします。

  2. /src/main/app/mule-app.properties ファイルの OAuth 2 ユーザ名パスワード設定に OAuth 2 ログイン情報を指定します。

    • dynamics365.username - セッションの初期化に使用するユーザ名。

    • dynamics365.password - ユーザの認証に使用するパスワード。

    • dynamics365.resource - Web API のアプリケーション ID URI (セキュアなリソース)。リソースは、CRM バージョンを指定しない、ルート URI である必要があります。https://YOUR_ORG.crm.dynamics.com/ のような形式です。

    • dynamics365.clientId - アプリケーションを Azure Active Directory に登録したときに割り当てられたアプリケーション ID。この ID は Azure Portal で確認できます。[Active Directory] をクリックして、ディレクトリをクリックし、アプリケーションを選択してから [Configure (設定)] をクリックします。

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

    • dynamics365.tokenRequestEndpoint - アクセストークンを取得するためにコールするトークンエンドポイント。
      +https://login.windows.net/TENANT_ID/oauth2/token のような形式で、TENANT_ID は Azure Active Directory ID です。

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

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

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

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

XML フローの例

<?xml version="1.0"?>

<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/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" doc:id="2e53345d-33af-42cc-9c35-737ef41266e4" >
		<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" doc:id="823ca5ed-f274-47d7-a054-25d8a8da3eb5" >
		<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" doc:id="5be799cf-e01a-416b-a3bb-084f945f9da8" >
			<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" doc:id="9d1bc853-e9eb-4c4a-a323-f9b171583c76" >
			<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" doc:id="b8d51b91-b280-42b4-8ed4-43004fd94afb" >
			<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 Entitiy 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 Entitiy 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 Entitiy Operation'" level="INFO" doc:name="Logger"/>
        <ee:transform doc:name="Response to JSON" doc:id="3da385b1-b9fe-4f25-b8b0-a0e0521cc0cf" >
			<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" doc:id="708cf0f5-14e5-47d9-9e2a-0e8c656898e6" >
			<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" doc:id="c6d79b71-1667-44b9-b39b-7a4ce2c6638d">
			<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 'Dissasociate 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 'Dissasociate 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>

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub