![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Dynamics CRM Web Api
Vic.Tang
Microsoft Dynamics 365 认证专家、MVP、MCT;Base上海,长期从事咨询、实施顾问、系统架构、培训;熟悉PowerPlatForm(Canvas App,Automate,MDA), Dynamics 365 Online(On-Premises),Dynamics CRM2016,Dynamics CRM2015,Dynamics CRM2013,Dynamics CRM2011,Dynamics CRM4.0, 咨询、培训、开发与实施经验丰富;承接产品应用、技术培训及其他合作;欢迎圈内朋友沟通交流;联系邮箱VicTang1104@outlook.com
展开
-
Dynamics 365Online 使用Xrm.WebApi.online.execute执行自定义Action
D365V9以后引入了新的API,其中比较Nice的是给我们封装了WebApi,不需要我们再去写request了,本篇要分享的是如何使用SDK中的Xrm.WebApi.online.execute来执行自定义的Entity类型的Action。 Docs中对execute执行Action是有示例的,比如下面的sample,但是这是global的Action,可以看到红框中的bo...原创 2019-11-29 10:04:47 · 1236 阅读 · 0 评论 -
Dynamics CRM2016 WebApi之alternate key的更新与删除
之前已有篇博文介绍了web api 利用alternate key来查询数据,最近有人问起,是否可以利用alternate key来更新和删除数据呢,查询SDK后并没有发现说支持这样做,那就需要实践下了。 比如通过如下示例代码将客户名称为DTCC的记录中的地址字段从"北京"改成"上海"(前提是设置accout的name字段为alternate key) HttpWebRequest req =原创 2017-06-21 10:46:40 · 1453 阅读 · 0 评论 -
Dynamics 365 Update0.1 修复了web api中fetchxml的linkentity的属性的FormattedValues无效的问题
在CRM2016中,用web api 通过fetchxml查询数据linkentity中的查找字段属性的FormattedValues是缺失的,也就是说就算在请求头部加上了Prefer"odata.include-annotations=OData.Community.Display.V1.FormattedValue",查找字段还是无法显示名字只能显示value值。 以下示例数据用的是CR原创 2017-05-03 12:02:18 · 1419 阅读 · 1 评论 -
Dynamics CRM2016 Web Api Filter查询中的特殊字符串处理
在使用web api 查询数据时,filter查询参数或者fetchxml查询参数都是写在了url上,我们需要对整个查询字符串进行编码,但很多特殊字符串是无法编码这就导致了问题。 比如下面这个例子,查询条件是new_name字段,传入了一个字符串带了&符号,浏览器就没法解析了 这种情况就需要将这些特殊字符串替换掉,&符号对应的是%26,替换后就可以正确的查询了 特殊字符串不止是&原创 2017-04-16 20:26:17 · 2082 阅读 · 0 评论 -
Dynamics CRM2016 Web API之查询单个属性字段的值
之前已有文章介绍过通过web api来更新单个属性字段的值,本篇要讲的是查询,查询其实很简单但其中有个注意点,这就是本篇文章的目的。 主要的区别在于js代码返回的结果的处理上,下面这段代码乍看之下没问题,其实是错的,request的url的url是没问题的,错在返回结果的处理上 var req = new XMLHttpRequest() req.open("get", Xrm.Pa原创 2017-04-19 15:02:17 · 1424 阅读 · 0 评论 -
Dynamics CRM2016 通过web api来调用自定义action之global action
上篇介绍web api调用自定义action中用到的demo是基于特定的实体,那本篇要分享的是global action,区别在于一个是私有方法一个是公用方法(个人理解的说法)。 如何新建一个action这里就不说了,具体参见上篇,直接看下前端js的调用代码,与上篇的示例代码的区别是request的url的最后部分,global action直接写上action的唯一名称即可,而上篇基于实原创 2017-04-29 12:53:48 · 2941 阅读 · 1 评论 -
Dynamics 365 支持使用Web Api 通过名称来检索元数据
关键检索元数据我在之前的一篇博文中稍有提及,当时是为了取实体的picklist字段的属性,但当时的版本只支持通过metadataid检索,而在365中又增加了名称的检索,方便了很多。 本篇依旧用之前博文中的例子来查询accout的实体的picklist元数据,下图是365online的查询结果,直接通过localname='account'进行查询picklist元数据,而不需要再去先抓取me原创 2017-02-15 13:19:43 · 1842 阅读 · 0 评论 -
Dynamics 365 Web Api之基于single-valued navigation property的filter查询
本篇要讲的是dynamics 新版本中web api的一个改进功能,虽然改进的很有限,但至少是改进了。 举个例子,我们现在知道联系人的名字vic,我们想找出客户记录中主要联系人名字为vic的所有客户,按照之前odata的方式,是先根据名字查询出所有叫vic的联系人记录guid,然后在遍历这些联系人guid去查询客户记录。但现在已经是web api的时代,有没有更简便的方式呢?很遗憾在2016原创 2016-12-20 15:15:59 · 1308 阅读 · 0 评论 -
Dynamics 365Online Server-Side OAuth身份认证
在上篇演示了在html页面中通过调用online的OAuth身份验证后再通过web api取10条客户数据并展示,本篇继续讲述如何在server-side程序中调用online的OAuth认证再通过web api取客户数据。 azure的应用程序设置本篇就不做过多说明,可参照上篇,在设置应用程序的类型时有些区别,这里选择的是本机客户端应用程序。 贴上源代...原创 2016-12-25 16:10:25 · 3402 阅读 · 0 评论 -
Dynamics CRM2016 解决C#调用web api报错无法显示错误详情的问题
在js中调用web api如果报错,比如400 bad request,比如500都会在response中看到具体的错误,方便我们及时修正,但是在c#中通过httpwebrequest调用报错是看不到的,所以往往需要我们把url拷出来在浏览器里查看,甚至需要借助第三方工具来查看非get请求类的错误,还是比较麻烦的。 先来看下普通的httprequest方式报错返回是什么样的,示例代码很简单,原创 2017-07-14 15:48:19 · 2768 阅读 · 0 评论 -
Dynamics 365 Web Api 创建与更新返回记录ID及更新后的数据记录
在Dynamics CRM2016中web api的创建返回的status是204,response中没有返回任何数据,所以我们在要取返回数据记录的id时必须要通过截取字符串的方式去header中取。 那Dynamics 365改进了这个问题,通过在请求头中加prefer的方式,对创建的repuest进行了改进 var entity = {}; entity["name"] = '测试原创 2017-08-17 19:22:35 · 2494 阅读 · 0 评论 -
Dynamics CRM2016 通过web api来调用自定义action
action操作很早就已出现,今天要分享的是通过web api来调用action,该功能在online版本中非常有用,可以将js中复杂的逻辑操作放在处理能力更强的后端来做。 首先咱们先简单的新建一个action,实体设置上可以设置为全局的,也可以单独设定某个实体,我这边的demo用的是案例实体 设置好后确定跳转到下一页,这一页需要设置唯一名称(后面调用代码中会用到),简单设置了两个输入原创 2017-04-10 11:33:15 · 4793 阅读 · 0 评论 -
Dynamics CRM JS通过WebAPI调用Action时,返回参数为复杂类型时的BUG验证
之前的博客介绍过,JS如何通过web api调用action。在action的参数类型中有很多种,如下图所示,红框中圈出来的我们称之为复杂类型,剩余的我们称之为简单类型。 本次的分享针对的是返回参数是复杂类型的,比如下面这个简单的全局action,我定义了一个简单类型输入参数和一个简单类型输出参数和一个复杂类型的输出 当我们在js中用web api对其调用时会...原创 2018-08-17 15:23:46 · 1576 阅读 · 5 评论 -
Dynamics 365 Web API Set Values of all Data Types using Web API in Dynamics CRM Through C#
关于web api的调用过程中的赋值,之前的博文有过介绍,转载的这篇多了ActivityParty ,供参考 转载博文链接转载 2018-06-27 13:12:03 · 321 阅读 · 0 评论 -
Dynamics CRM2016 Set Values of all Data Types using Web API
之前的博客里有谈到了web api的增删改查,里面会涉及到各种类型字段的赋值,因为时间和精力关系,没有对所有的字段类型一一测试,这篇博文中给出了全部的http://inogic.com/blog/2016/02/set-values-of-all-data-types-using-web-api-in-dynamics-crm/有需要的朋友可以参考下。转载 2016-04-26 17:15:31 · 907 阅读 · 0 评论 -
Dynamics CRM2016 Update or Create parentcustomerid in Contact using web api
联系人实体中有个特殊的字段parentcustomerid诶 在通过web api创建或更新记录时,如果在给这个字段赋值时当做查找字段对待的话,那你就会遇到问题了,报错信息如下 正确的赋值方式如下原创 2016-05-11 10:42:51 · 1440 阅读 · 0 评论 -
Dynamics 365 Web API 批处理(batch requests)
在组织服务中有executemultiple来执行批处理,那web api是否有批处理呢?答案是有的。 批处理的请求url很简单[Organization URI]/api/data/v8.2/$batch,在最后加个$batch就行,但body非常的难拼,换行空格大小写,幺蛾子很多,本篇分别分享下js中的body拼写和C#中的body拼写,着重介绍下我在拼的过程中遇到的幺蛾子。 先...原创 2018-06-11 16:29:04 · 1660 阅读 · 0 评论 -
Dynamics 365 Web API模拟用户
在实际业务场景中,用户只能看到自己权限内的数据,比如客户数据,公司的销售员只能看到属于自己的客户数据,但有这么个场景又需要某个销售员A去读取另一个销售员B的数据(当然他是没有权限读取的),这种场景下该怎么办,当然这个假设场景不一定合理,只是一种假设来引出本篇要讲的内容。 上述场景即可以使用模拟用户来操作,在JS中读取B的数据时,我们可以模拟B的权限而不是当前A的权限。 只需在常规的...原创 2018-06-11 11:46:40 · 1641 阅读 · 4 评论 -
Dynamics 365 基于ADFS 2016(4.0)的OAuth2 CRM Web API Request
前年我写过一篇Dynamics 365 Online基于OAuth2身份验证的Web Api Request,点击查看,该方式是基于azure的,需要在azure中注册clientid,在这之后尝试过on-presimes的server-side的OAuth搞Web Api Request一直没有成功,后来得知是因为adfs3.0不支持,最近在Windows server2016上操作成功了...原创 2018-05-03 22:58:46 · 3929 阅读 · 0 评论 -
Dynamics 365 Web Api 检查用户是否具有某个安全角色
用户和安全角色的关系是N:N,所以要查询用户是否拥有某个安全角色即去查找对应的中间表取值即可,那web api如何来查询N:N关系。 先看下查询的xml,这里的entity name即是实体关系名称 var roleXml = "<fetch no-lock='true' output-format='xml-platform'>\ ...原创 2018-03-28 14:15:01 · 951 阅读 · 0 评论 -
Dynamics 365Online 使用adal.js注册和配置SimpleSPA应用程序
本篇是基于dynamics 365online撰写,本文中使用的365online及azure均为试用版,因为online在国内还没落地,所以我申请的是新加坡版,online的申请方式可见我之前的博文有分享,如果已有online没有azure则可用dynamics 365的账号登陆office 365,点击下图中红框中的azure ad跳转到azure页面进行申请,试用版的申请需要绑定下信用卡,试原创 2016-12-25 12:48:35 · 1655 阅读 · 0 评论 -
Dynamics 365Online 查询Web Api的请求WebUri
在on-premises版本中,获取weburi的方式是进设置-自定义项-开发人员资源中查看地址,但online版本中的地址会有些许的差异 online的开发者资源中的地址如下图,如果你在页面javascript中开发web api用这个地址时就会报错了,正确的地址应该是https://test1207.crm5.dynamics.com/api/data/v8.2/原创 2016-12-21 11:50:40 · 1488 阅读 · 0 评论 -
Dynamics CRM2016 Web Api之根据时间查询数据
我的博文里已经有多次提到CRM中的时间处理问题了,本篇继续探讨在web api的场景下时间字段如何处理,本篇只涉及查询,针对2016中新增的时间行为"用户当地时间"和"无时区"展开。 首先以我客户中的一条数据为例,出生日期为“2016/3/16”,类型为“用户当地时间” 但当我以“2016-03-16”作为条件通过web api去查询时,却查不到任何数据(其实这个时候原创 2016-05-22 16:32:43 · 2237 阅读 · 4 评论 -
Dynamics CRM2016 Web Api之更新时间字段值
前篇我们论述了时间字段的查询,本篇来论述下时间字段的更新。 还是以之前建的当地时间(时间行为为用户当地时间)字段来测试 可以看到web api更新的是数据库的时间,而在前台的反映就是做了加8处理,所以后期在时间字段的处理上要多加注意,分清楚该之间字段的行为到底是什么。原创 2016-05-22 16:58:18 · 9818 阅读 · 3 评论 -
Dynamics CRM2016 Web Api之时间字段值的处理
本篇又是一次来谈到CRM中时间字段的问题,那这次要谈的是在引用web api过程中写代码上的注意事项,常用的代码场景即JS和c#. 先来看下js,从下图中可以看到,我直接将new Date()赋值给时间字段时,经过json序列化后会将本地时间转化为国际时间,那如果我的时间字段的行为是无时区,写进后台数据库的就是国际时间那就是错误的,会有8小时的时差。 那怎么办呢,我原创 2016-07-26 14:25:47 · 2402 阅读 · 0 评论 -
Dynamics CRM2016 Web API获取实体元数据Picklist属性的Text&Value
通过组织服务中获取实体picklist字段的text和value可以通过RetrieveAttributeRequest实现,但在使用web api的今天该怎么实现,本文即来一探究竟,本篇基于SDK中的Query Metadata using the Web API一节。 首先我们要获取到实体的metadataid,代码如下,这个metadataid后面会用到,我这里用的是account实原创 2016-09-28 16:21:03 · 2791 阅读 · 3 评论 -
Dynamics CRM2016 使用web api来创建注释时的注意事项
在使用wei api 创建注释的时候,有个字段需要注意下,就是下面图中的objectid字段,虽然它是个查找字段,但不能像普通的查找字段property@odata.bind来赋值 上代码,注意看倒数倒数第三行,赋值方式是objectid_account,这里我是给客户实体创建一条注释 Dictionary dic = new Dictionary();原创 2016-11-01 18:35:34 · 1149 阅读 · 0 评论 -
Dynamics CRM2016 Web API之删除单个查找字段值
之前的博文中有介绍过,Web Api中的一个删除单个属性的Api但没提供查找字段的删除方法,本篇补充上,这里给出的示例代码是C#的(主要看url的拼接),看下url中最后的/$ref,这个标示表明了当前删除的字段是一个查找类型的,区别就在这。 string weburi = System.Configuration.ConfigurationManager.AppSettings["WebUri"原创 2016-11-09 20:30:40 · 1326 阅读 · 0 评论 -
Dynamics CRM2016 WebApi查询之alternate key
本篇继续来分享web api查询中的一条,利用alternate key进行查询。 alternate key是个什么东西这里就不解释了如果有不知道的可以去看sdk。这里以房号信息实体为例,新建一个键叫做房号Id,这个房号id在crm中对应的是new_roomid这个文本字段,会和第三方系统的某张表的主键关联。 键值建好后来看下代码,这里返回的json格式和通过实体guid查出来的返原创 2016-11-21 17:46:43 · 1691 阅读 · 0 评论 -
Dynamics CRM2016 Web Api之查询查找字段的相关属性
之前有篇博文介绍了如何获取查找字段的name值(跳转),本篇在此基础上再延伸下,实现的效果类似于EntityReference,可以取到查找字段的id,name,localname。 这里我以客户实体为例,定义了一个叫new_city的查找字段,现在获取它的值 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http:原创 2016-12-03 14:03:18 · 2072 阅读 · 0 评论 -
Dynamics CRM2016 Web API之获取查找字段的text及选项集的text
本篇再来介绍个web api的功能,关于lookup的text这里只是略带,因为有expand,现有的web api就能实现,主要提的是选项集的text,我们通过基本的查询api查出来的字段值只带有value,如果想要获取text也很简单,只需要在request的头部加一条信息即可,下面分别给出了C#及JS的示例代码。 HttpWebRequest req = (HttpWebRequest)原创 2016-05-16 20:37:11 · 10696 阅读 · 1 评论 -
Dynamics CRM2016 Web API之Use custom FetchXML
CRM2016中新增的web api支持fetch xml了,之前使用FetchXML的场景是在后天代码中通过组织服务的retrieve multiple方法,但实际的应用效果有多大,还需要在实际的项目中去体会了。 上代码,注意要对fetch xml进行编码 var fetch="" +"" +" " + " "原创 2016-04-01 14:18:26 · 2105 阅读 · 1 评论 -
Dynamics CRM2016 Web API之Create related entities in one operation
本篇继续来介绍两个web api的接口,一个是“Create related entities in one operation”即在一步操作中完成主实体的创建加关联实体的创建,一个是“Associate entities on create“即在创建记录的时候填充lookup字段。 先来说第一个api,老规矩直接上代码,稍微做下解释,注意下面的几点不存在先后顺序,我只是分开说明罢了原创 2016-04-01 10:05:16 · 2277 阅读 · 0 评论 -
Dynamics CRM2016 Web API之通过实体的primary key查询记录
CRM2016启用了webapi 而弃用了odata,作为码农的我们又开始学习新东西了。下面是一段简单的查询代码,通过systemuser的primary key来查询一条记录Web API查询方式 var userId = Xrm.Page.getAttribute("ownerid").getValue()[0].id; var appellation; $.原创 2016-03-14 22:11:47 · 2777 阅读 · 3 评论 -
Dynamics CRM2016 Web API之通过实体的primary key查询记录(二)
继续接上篇,还是通过primary key来查询数据,本篇介绍两个我个人比较喜欢的查询方式,一个是查询单个字段,一个是查询lookup关联实体中的属性字段。 先来看如何查询单个字段,只需要在url的最后加上“/字段名",作用同表达式"?$select=字段名",前者的返回值直接取value值即可,很简洁。 $.ajax({ async: false, ...原创 2016-03-15 22:21:18 · 3208 阅读 · 0 评论 -
Dynamics CRM2016 Web API之创建记录
前篇介绍了通过primary key来查询记录,那query的知识点里面还有很多需要学习的,这个有待后面挖掘,本篇来简单介绍下用web api的创建记录。 直接上代码,这里的entity的属性我列了几个比较典型的,和原来相比有区别的是选项集、货币以及lookup字段,其中lookup字段赋值变化最大,new_testid即lookup的字段名,@后面的是标准写法,关联的实体...原创 2016-03-16 23:03:24 · 5442 阅读 · 19 评论 -
Dynamics CRM2016 Web API之更新记录
本篇继续探索web api,介绍如何通过web api更新记录。 下面是一段简单的更新代码,更新了几个不同类型的字段,entity的赋值和前篇创建时候的一样的。var entity = {}; entity["name"] = '测试更新';//文本 entity["new_gender"] = 100000001;//选项集 entity["new_birt原创 2016-03-17 13:31:39 · 2907 阅读 · 0 评论 -
Dynamics CRM2016 Web API之更新记录的单个属性字段值
在web api中提供了对单个属性的更新接口,这和查询中查询单个属性类似,对这个接口我个人也是比较喜欢的。 var id = "{D1E50347-86EB-E511-9414-ADA183AB6249}"; var propertyValue="测试"; $.ajax({ async: false, type: "PUT",...原创 2016-03-17 21:41:47 · 2462 阅读 · 1 评论 -
Dynamics CRM2016 Web API之删除
相比之前的增改查,删除就显得简单的多了。 这里的request的type为delete,删除成功的status为204,404则是要删除的记录不存在var id = 'BAD90A95-7FEA-E511-9414-ADA183AB6249'; $.ajax({ async: false, type: "DELETE ", co原创 2016-03-18 11:20:11 · 2031 阅读 · 0 评论 -
Dynamics CRM2016 Web API之Retrieve Multiple
之前的博文只介绍了通过记录的primary key来查询单条记录或者单个属性值,本篇介绍多条记录的查询方法var filter = "?$filter=name eq '123'"; var req = new XMLHttpRequest() req.open("get", encodeURI(Xrm.Page.context.getClientUrl() + "/ap原创 2016-03-29 21:20:52 · 2905 阅读 · 0 评论