zoukankan      html  css  js  c++  java
  • 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方法,有兴趣的同学也可以去看一下。

  • 相关阅读:
    (C)const关键字
    (C)volatile关键字
    蛋疼的四旋翼
    多线程之:死锁
    多线程之:ThreadLocal
    多线程之:线程同步代码块
    多线程之:线程安全
    多线程之:竞态条件&临界区
    多线程之:java线程创建
    多线程之:多线程的优缺点
  • 原文地址:https://www.cnblogs.com/jfzhu/p/2728508.html
Copyright © 2011-2022 走看看