zoukankan      html  css  js  c++  java
  • Dynamics CRM 2015/2016新特性之二十五:使用Web API代理其他用户操作

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复208或者20160317可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!
    要测试代理,首先最好给用户增加一个 代理 的角色,如下所示:

    值得注意的是,使用代理能后的权限,是当前用户和代理用户两者权限的并集,不是合集啊,换句话说,是两者都有的权限才能做,不是我们通常认为的是代理用户的权限能做的所有事情。

    我这里使用的代码如下,其实也就一个变化,是增加了

    req.setRequestHeader("MSCRMCallerID", "E9CD027F-26A3-E511-80C6-000D3A807EC7");

    这行代码,这个参数的值当然就是代理用户的ID了。
    function UTCToLocalTime(d) {
        var timeOffset = -((new Date()).getTimezoneOffset() / 60);
        d.setHours(d.getHours() + timeOffset);
        return d;
    }
    
    function ConvertStringToDatetime(dateString) {
        var reggie = /(d{4})-(d{2})-(d{2})T(d{2}):(d{2}):(d{2})Z/;
        var dateArray = reggie.exec(dateString);
        var dateObject = new Date(
            (+dateArray[1]),
            (+dateArray[2]) - 1,
            (+dateArray[3]),
            (+dateArray[4]),
            (+dateArray[5]),
            (+dateArray[6])
        );
        return dateObject;
    }
    
    function NameOnchangeHandler() {
        var clientURL = Xrm.Page.context.getClientUrl();
        var req = new XMLHttpRequest()
        req.open("POST", encodeURI(clientURL + "/api/data/v8.0/ly_tests"), true);
        req.setRequestHeader("Accept", "application/json");
        req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        req.setRequestHeader("MSCRMCallerID", "E9CD027F-26A3-E511-80C6-000D3A807EC7");
        req.setRequestHeader("OData-MaxVersion", "4.0");
        req.setRequestHeader("OData-Version", "4.0");
        req.onreadystatechange = function () {
            if (this.readyState == 4 /* complete */) {
                req.onreadystatechange = null;
                if (this.status == 204) {
                    var testUri = this.getResponseHeader("OData-EntityId");
                    Xrm.Utility.alertDialog("创建成功的罗勇测试试题记录的URI: " + testUri)
                }
                else {
                    var error = JSON.parse(this.response).error;
                    Xrm.Utility.alertDialog("创建罗勇测试实体记录出错." + error.message);
                }
            }
        };
        var test = {};
        test.ly_name = "单行文本";//单行文本
        test.ly_alternatekey = "13926492290";//单行文本
        test.ly_bool = true;//两个选项
        test.ly_datetime = ConvertStringToDatetime('2016-01-07T11:22:30Z');//日期和时间,需要将UTC时间转换为本地时间
        test.ly_decimal = 10.01;//十进制数
        test.ly_float = 10.02//浮点数
        test["ly_Lookup@odata.bind"] = "/accounts(CE23165A-3AA3-E511-80C7-000D3A807EC7)"//查找字段,注意去/api/data/v8.0/$metadata页面查看关系的Partner属性的值
        test.ly_integer = 10;//整数
        test.ly_money = 10.03;//货币
        test.ly_multilinetext = "多行文本";//多行文本
        test.ly_optionset = 364750000;//选项集
        test.ly_singlelinetext = "单行文本";//单行文本
        req.send(JSON.stringify(test));
    }

    使用代理创建的记录,代理用户是存储在createdby (中文显示名称是 创建者)和modifiedby(中文显示名称是 修改者),而当前用户是存储 createdonbehalfby (中文显示名称是 创建者(代理))和 modifiedonbehalfby (中文显示名称是 创建者(代理))字段。

    如何查询代理用户的信息呢,其实也很简单,使用expand 就可以。
    http://lycrmvm.cloudapp.net:5555/Demo/api/data/v8.0/ly_tests(A576C4B5-44A9-E511-80CF-000D3A806074)?$select=ly_name&$expand=createdby($select=fullname),createdonbehalfby($select=fullname),owninguser($select=fullname)
     
    更多信息请参考官方文档:Impersonate another user using the Web API .
    现在推荐用 CallerObjectId 来代替 MSCRMCallerID。
     
     
  • 相关阅读:
    OSG嵌入QT(QT界面使用Qt Designer编辑)
    C++ Makefile文件编写
    cbp2make使用
    for循环之后的return
    C++引用形参,函数返回多个值
    个人感悟之代理模式
    个人感悟之单例模式
    个人感悟之简单工厂模式-工厂方法模式-抽象工厂模式
    Java设计模式
    (转)java之Spring(IOC)注解装配Bean详解
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Web_API_Impersonate_Another_User.html
Copyright © 2011-2022 走看看