Dynamics CRM 2011编程系列(51):FetchExpression(二)----JavaScript也疯狂
2013-03-04 16:53
369 查看
本文来探索下在弱客户端下通过FetchExpression来访问Dynamics CRM 2011系统中的数据。在Dynamics CRM 2011系统中客户端居然用FetchExpression来获取系统中的数据,看上去是那么的复古(当前开发人员可以使用系统的REST端点)。但本文仅仅起到一个抛砖引玉的作用,Dynamics CRM 2011 系统存在大量的消息类(API)。通过这些消息类,我们可以完成对系统的各种操作(禁用记录,激活工作流等),详细内容各位看官可以参阅文章《Dynamics CRM 2011 消息类列表》。
当然啦,如果我们在强客户端(C#,VB.Net)调用这些消息类。微软会为我们提供非常好的开发人员体验,SOAP报文的发送和接收完全被封装,一切都不需要自己干预。但如果我们要在弱客户端上调用这些消息类,那该如何是好呢?元芳你怎么看呢?
各位看官莫慌,莫慌,请参考文章《Dynamics CRM 2011编程系列(50):使用SOAPLogger抓取报文》,在这里我已经给出了解决方案了。
好吧,现在一切准备都完毕了,让我们动起来吧。
图1
图2
在这里我没有处理服务器返回的SOAP报文,但官们可以根据自己的需要来处理它们。
在Dynamics CRM 2011 系统中,所有的消息类都能通过这样的方式在JavaScript函数中进行调用。
当然各位看官们可以结合第三方的JavaScript类库来提交SOAP报文。
当然啦,如果我们在强客户端(C#,VB.Net)调用这些消息类。微软会为我们提供非常好的开发人员体验,SOAP报文的发送和接收完全被封装,一切都不需要自己干预。但如果我们要在弱客户端上调用这些消息类,那该如何是好呢?元芳你怎么看呢?
各位看官莫慌,莫慌,请参考文章《Dynamics CRM 2011编程系列(50):使用SOAPLogger抓取报文》,在这里我已经给出了解决方案了。
好吧,现在一切准备都完毕了,让我们动起来吧。
1.运行SOAPLogger抓取报文,在Run方法中输入填入如下代码:
FetchExpression fetchExp = new FetchExpression(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='contact'> <attribute name='fullname' /> <attribute name='contactid' /> <order attribute='fullname' descending='false' /> </entity> </fetch>"); slos.RetrieveMultiple(fetchExp);
2.在output.txt文件中获取截获的SOAP报文。
HTTP REQUEST -------------------------------------------------- POST http://msstore-test-02.northamerica.corp.microsoft.com:5550/Example/XRMServices/2011/Organization.svc/web Content-Type: text/xml; charset=utf-8 SOAPAction: http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <RetrieveMultiple xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <query i:type="a:FetchExpression" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts"> <a:Query><fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='contact'> <attribute name='fullname' /> <attribute name='contactid' /> <order attribute='fullname' descending='false' /> </entity> </fetch></a:Query> </query> </RetrieveMultiple> </s:Body> </s:Envelope> --------------------------------------------------
3.当前系统中存在的数据
图1
4.在Contact实体的表单OnLoad事件中编写如下代码(用Ajax向服务器提交SOAP报文)
var queryurl = "http://Server Name/Organization Name/XRMServices/2011/Organization.svc/web"; var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); var fetchExp = ['<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' , '<s:Body>' , '<RetrieveMultiple xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' , '<query i:type="a:FetchExpression" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">' , '<a:Query>' , '<![CDATA[' , '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">' , ' <entity name="contact">' , ' <attribute name="fullname" />' , ' <attribute name="contactid" />' , ' <order attribute="fullname" descending="false" />' , ' </entity>' , '</fetch>' , ']]>' , '</a:Query>' , '</query>' , '</RetrieveMultiple>' , '</s:Body>' , '</s:Envelope>']; xmlhttp.Open("POST", queryurl, false); xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*"); xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xmlhttp.setRequestHeader("SOAPAction", " http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple"); xmlhttp.Send(fetchExp.join('').toString()); if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { alert(xmlhttp.responseText); } } else { }
5.系统返回如下报文
图2
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <RetrieveMultipleResponse xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <RetrieveMultipleResult xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts"> <a:Entities> <a:Entity> <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic"> <a:KeyValuePairOfstringanyType> <b:key>fullname</b:key> <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Bob Li</b:value> </a:KeyValuePairOfstringanyType> <a:KeyValuePairOfstringanyType> <b:key>contactid</b:key> <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">441f1166-5c56-e211-af85-00155d1ce818</b:value> </a:KeyValuePairOfstringanyType> </a:Attributes> <a:EntityState i:nil="true" /> <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> <a:Id>441f1166-5c56-e211-af85-00155d1ce818</a:Id> <a:LogicalName>contact</a:LogicalName> <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> </a:Entity> <a:Entity> <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic"> <a:KeyValuePairOfstringanyType> <b:key>fullname</b:key> <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Clark Wang1</b:value> </a:KeyValuePairOfstringanyType> <a:KeyValuePairOfstringanyType> <b:key>contactid</b:key> <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">71e70aab-5c56-e211-af85-00155d1ce818</b:value> </a:KeyValuePairOfstringanyType> </a:Attributes> <a:EntityState i:nil="true" /> <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> <a:Id>71e70aab-5c56-e211-af85-00155d1ce818</a:Id> <a:LogicalName>contact</a:LogicalName> <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> </a:Entity> <a:Entity> <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic"> <a:KeyValuePairOfstringanyType> <b:key>fullname</b:key> <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Hitesh White</b:value> </a:KeyValuePairOfstringanyType> <a:KeyValuePairOfstringanyType> <b:key>contactid</b:key> <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">87cf252c-7463-e211-9a59-00155d1ce818</b:value> </a:KeyValuePairOfstringanyType> </a:Attributes> <a:EntityState i:nil="true" /> <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> <a:Id>87cf252c-7463-e211-9a59-00155d1ce818</a:Id> <a:LogicalName>contact</a:LogicalName> <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> </a:Entity> <a:Entity> <a:Attributes xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic"> <a:KeyValuePairOfstringanyType> <b:key>fullname</b:key> <b:value i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">Jim Green</b:value> </a:KeyValuePairOfstringanyType> <a:KeyValuePairOfstringanyType> <b:key>contactid</b:key> <b:value i:type="c:guid" xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/">396a665a-5c56-e211-af85-00155d1ce818</b:value> </a:KeyValuePairOfstringanyType> </a:Attributes> <a:EntityState i:nil="true" /> <a:FormattedValues xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> <a:Id>396a665a-5c56-e211-af85-00155d1ce818</a:Id> <a:LogicalName>contact</a:LogicalName> <a:RelatedEntities xmlns:b="http://schemas.datacontract.org/2004/07/System.Collections.Generic" /> </a:Entity> </a:Entities> <a:EntityName>contact</a:EntityName> <a:MinActiveRowVersion>-1</a:MinActiveRowVersion> <a:MoreRecords>false</a:MoreRecords> <a:PagingCookie><cookie page="1"><fullname last="Jim Green" first="Bob Li" /><contactid last="{396A665A-5C56-E211-AF85-00155D1CE818}" first="{441F1166-5C56-E211-AF85-00155D1CE818}" /></cookie></a:PagingCookie> <a:TotalRecordCount>-1</a:TotalRecordCount> <a:TotalRecordCountLimitExceeded>false</a:TotalRecordCountLimitExceeded> </RetrieveMultipleResult> </RetrieveMultipleResponse> </s:Body> </s:Envelope>
小结
在这里我没有处理服务器返回的SOAP报文,但官们可以根据自己的需要来处理它们。在Dynamics CRM 2011 系统中,所有的消息类都能通过这样的方式在JavaScript函数中进行调用。
当然各位看官们可以结合第三方的JavaScript类库来提交SOAP报文。
相关文章推荐
- Dynamics CRM 2011编程系列(59):FetchExpression(三)----分组查询
- Dynamics CRM 2011编程系列(49):FetchExpression(一)
- Dynamics CRM 2011编程系列(43):JavaScript 的调试
- Dynamics CRM 2011编程系列(47): JavaScript调试之模态窗口
- Dynamics CRM 2011编程系列(52):分享一款用来测试FetchExpression的工具(FetchExpImpersonator)
- Dynamics CRM 2011编程系列(44):JavaScript 的 Hack 调试(Fiddler)
- Dynamics CRM 2011编程系列(44):JavaScript 的 Hack 调试(Fiddler)
- Dynamics CRM 2011编程系列(34):报表的制作(一)
- Dynamics CRM 2011编程系列(35):报表的制作(二)
- Dynamics CRM 2011编程系列(36):报表的制作(三)
- Dynamics CRM 2011编程系列(37):调用报表的72般绝技
- Dynamics CRM 2011编程系列(45):编程实现文档上传功能
- Dynamics CRM 2011编程系列(38):调用报表的神器(GhostHook)
- Dynamics CRM 2011编程系列(56):使用Business Connectivity Services 集成Sharepoint 2010 (上)
- Dynamics CRM 2011编程系列(53):客户端实体序列化工具--MagicBox
- Dynamics CRM 2011编程系列(50):使用SOAPLogger抓取报文
- Dynamics CRM 2011编程系列(39):Ribbon Button + GhostHook
- 集成实现Dynamics CRM 2011编程系列(55):Dynamics CRM 集成开发简述
- Dynamics CRM 2011编程系列(54):MagicBox实现原理
- Dynamics CRM 2011编程系列(55):Dynamics CRM 集成开发简述