本記事は「Dynamics CRM Online Fall ’13にPHPで接続する(その1:認証編)」の続きとなります。
今回は認証後のSOAPによるデータ取得について紹介します。
(記事一覧はタグ:Dynamics CRM 2013にPHPで接続するを参照ください。)
サンプルのPHPでDynamics CRMと通信する処理はSOAPを利用しています。
(ほかにもRESTでも取得できるようですが、PHPでもできるかは確認できませんでした)
SOAPの通信はWSDL(Web Services Description Language)という形でインターフェイスが定義されています。
Dynamics CRM でも「設定」→「カスタマイズ」→「開発者リソース」のページで以下の画像のようにWSDLが参照できます。
WSDLをVisualStudioで読みこんでC#で利用する方法についてはPHP編がひと段落したら書いてみようと思います。
SOAPLoggerで通信してみる
PHPでSOAP通信をするための問い合わせXMLを調べたいと思いました。
Web上にも色々情報があるのですが、いまひとつうまくいかない・・・。
こういう場合、実際に動くものから解析するのが良いということでSOAPLoggerというC#サンプルで通信してその中身を解析してみます。
SOAPLoggerはMicrosoft Dynamics CRM 2013 ソフトウェア開発キット の中にあります。
展開したフォルダの以下の位置にSOAPLoggerがあります。
SDK\SampleCode\CS\Client\SOAPLogger
SOAPLogger.slnをVisualStudioで開きます。
まずはそのままデバッグ実行してみます。
CRM serverのドメインのcrm・・・の部分を入力します。自分の場合crm5.dynamics.comです、
Dynamics CRM Online Fall ’13はOffice365アカウントで認証するのでyを選択します。
Dynamics CRMにログインする際のUsernameとPasswordを入力します。
組織番号を入力します。
私の場合一つしかないので1を入力してリターンキーを押します。
この状態だと何も動きがなくサンプルが終わるので、
コードを眺めてみます
SOAPLogger.csのRunメソッドを見ると・・・
SoapLoggerOrganizationService slos = new SoapLoggerOrganizationService(serverConfig.OrganizationUri, service, output);
//Add the code you want to test here:
// You must use the SoapLoggerOrganizationService 'slos' proxy rather than the IOrganizationService proxy you would normally use.
slosクラスを使って問い合わせできそうですが、
「望みのテストコードを書いてね」ということらしい。
今回は通信ログを見るだけの目的なので、UIには何も表示しないで以下のコードを追記します。
var query = new QueryExpression("contact");
query.ColumnSet = new ColumnSet("firstname", "lastname", "emailaddress1", "gendercode");
query.Criteria.AddCondition("lastname", ConditionOperator.Equal, "test");
var res = slos.RetrieveMultiple(query);
これはcontact(取引担当者)で姓がtestの一覧の名前、メールアドレス、性別という項目を取得するというサンプルです。
この通信の中身はFiddlerで確認します(今回はFiddlerの使い方は割愛します)。
たとえば上記条件の問い合わせのBODYは以下のようになります。
<s:Body>
<RetrieveMultiple xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services">
<query i:type="b:QueryExpression" xmlns:b="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<b:ColumnSet>
<b:AllColumns>false</b:AllColumns>
<b:Columns xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<c:string>firstname</c:string>
<c:string>lastname</c:string>
<c:string>emailaddress1</c:string>
<c:string>gendercode</c:string>
</b:Columns>
</b:ColumnSet>
<b:Criteria>
<b:Conditions>
<b:ConditionExpression>
<b:AttributeName>lastname</b:AttributeName>
<b:Operator>Equal</b:Operator>
<b:Values xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<c:anyType i:type="d:string" xmlns:d="http://www.w3.org/2001/XMLSchema">test</c:anyType>
</b:Values>
<b:EntityName i:nil="true"/>
</b:ConditionExpression>
</b:Conditions>
<b:FilterOperator>And</b:FilterOperator>
<b:Filters/>
</b:Criteria>
<b:Distinct>false</b:Distinct>
<b:EntityName>contact</b:EntityName>
<b:LinkEntities/>
<b:Orders/>
<b:PageInfo>
<b:Count>0</b:Count>
<b:PageNumber>0</b:PageNumber>
<b:PagingCookie i:nil="true"/>
<b:ReturnTotalRecordCount>false</b:ReturnTotalRecordCount>
</b:PageInfo>
<b:NoLock>false</b:NoLock>
</query>
</RetrieveMultiple>
</s:Body>
上のXMLをサンプルのdynamicsclient.phpに組み込むと以下のようになります。
(Columnsの項目や条件が多少違うので読み替えてください)
$getParentCustomer = '
<RetrieveMultiple xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services">
<query i:type="b:QueryExpression" xmlns:b="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<b:ColumnSet>
<b:AllColumns>false</b:AllColumns>
<b:Columns xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<c:string>firstname</c:string>
<c:string>lastname</c:string>
<c:string>emailaddress1</c:string>
<c:string>gendercode</c:string>
</b:Columns>
</b:ColumnSet>
<b:Criteria>
<b:Conditions/>
<b:FilterOperator>And</b:FilterOperator>
<b:Filters/>
</b:Criteria>
<b:Distinct>false</b:Distinct>
<b:EntityName>contact</b:EntityName>
<b:LinkEntities/>
<b:Orders/>
<b:PageInfo>
<b:Count>0</b:Count>
<b:PageNumber>0</b:PageNumber>
<b:PagingCookie i:nil="true"/>
<b:ReturnTotalRecordCount>false</b:ReturnTotalRecordCount>
</b:PageInfo>
<b:NoLock>false</b:NoLock>
</query>
</RetrieveMultiple>
';
$getParentCustomerResult = $this->sendQuery($getParentCustomer, 'RetrieveMultiple');
XML部分のほかに最後のsendQueryメソッドに渡す文字列が「Retrieve」から「RetrieveMutiple」に変わっている点に注意してください。
というわけで今回はDynamics CRMから取引担当者情報を複数件取得してみました。
次回はそれ以外にもある問い合わせの方法色々を紹介しようと思います。
Please give us your valuable comment