MS CRM 2011 在CRM中使用REST Endpoint

 

原创地址:http://www.cnblogs.com/jfzhu/archive/2012/10/17/2728508.html

转载请注明出处

 

CRM提供了两种WCF Web Service,一个是Organization Service,使用的是SOAP协议,另一个是Organization Data Service,使用的是OData(REST)协议。我们在为CRM写插件(plugin)的时候,通常都要用到第一种web service,而在客户端进行编程的时候就要使用到Organization Data Service了。Organization Data Service提供了REST Endpoint,它只能用于你写JScript脚本,或者在Silverlight中使用。具体细节也可以参看sdk中“Use the REST Endpoint for Web Resources”一节。

 

在本文中,我给大家一段代码来演示如何使用REST Endpoint。在account表单上,如果更改primary contact,我们使用Organization Data Service来获取新contact的address1_city地址栏。

if (typeof (AccountLibrary) == "undefined") {
    AccountLibrary = { __namespace: true };
}


AccountLibrary = {
    Name: "AccountLibrary",
    RetrieveContactCallBack: function (retrieveRecordsReq) {
        if (retrieveRecordsReq.readyState == 4 /* complete */) {
            if (retrieveRecordsReq.status == 200) {
                //Success
                var retrievedRecord = JSON.parse(retrieveRecordsReq.responseText).d;
                alert(retrievedRecord.Address1_City);
            }
            else {
                alert("Error : " + retrieveRecordsReq.status + ": " +
                    retrieveRecordsReq.statusText + ": " +
                    JSON.parse(retrieveRecordsReq.responseText).error.message.value);
            }
        }
    },
    PrimaryContactOnChange: function () {
        if (Xrm.Page.getAttribute("primarycontactid").getValue()) {
            var contactid = Xrm.Page.getAttribute("primarycontactid").getValue()[0].id;
            var retrieveEntityReq = new XMLHttpRequest();
            var ODataPath = Xrm.Page.context.prependOrgName("/xrmservices/2011/organizationdata.svc");
            retrieveEntityReq.open("GET", ODataPath + "/ContactSet(guid'" + contactid + "')?$select=Address1_City", true);
            retrieveEntityReq.setRequestHeader("Accept", "application/json");
            retrieveEntityReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            retrieveEntityReq.onreadystatechange = function () {
                AccountLibrary.RetrieveContactCallBack(this);
            };
            retrieveEntityReq.send();
        }
    }
}

要注意:

(1)Address1_City是Schema Name而不是Field Name。如果使用的是Field Name(address_city1),我们会得到以下的错误信息。“Error : 400: Bad Request: Type 'Microsoft.Crm.Sdk.Data.Services.Contact' does not have a property named 'address1_city'.”

 

(2)我们在RequestHeader 中设置使用了json,所以不要忘记在web resource中引用json.js。我在另一篇文章《MS CRM 2011 实例 -- 添加Connect子选项 》中介绍了如何添加son.js,有兴趣的同学可以看一下。

 

(3) XMLHttpRequest.open的方法中,第三个参数是用来指定是同步还是异步的,true为异步,false为同步。什么是同步异步,不懂的同学可以在网上,比如w3school上搜索一下AJAX技术,就会了解了。另外为了优化用户使用性能,我比较推荐使用异步方式。

 

(4)在本文的例子中,我使用的是Retrieve方法,我在另一篇文章《MS CRM 2011 实例 -- 添加Connect子选项 》中还介绍了如何使用Retrieve Multiple方法,有兴趣的同学也可以去看一下。

 

posted @ 2012-10-17 21:07  AI观星台  阅读(2174)  评论(1编辑  收藏  举报