继续接上篇,还是通过primary key来查询数据,本篇介绍两个我个人比较喜欢的查询方式,一个是查询单个字段,一个是查询lookup关联实体中的属性字段. 先来看如何查询单个字段,只需要在url的最后加上"/字段名",作用同表达式"?$select=字段名",前者的返回值直接取value值即可,很简洁. $.ajax({ async: false, type: "GET", contentType: "application/json…
CRM2016启用了webapi 而弃用了odata,作为码农的我们又开始学习新东西了. 下面是一段简单的查询代码,通过systemuser的primary key来查询一条记录 Web API查询方式 var userId = Xrm.Page.getAttribute("ownerid").getValue()[0].id; var appellation; $.ajax({ async: false, type: "GET", contentType: &qu…
在dynamics crm web api还没出现前,我们是通过fetchxml来实现的,当然这种方式依旧可行,那既然web api来了我们就拥抱新的方式. web api中我们通过指定查询的条数来实现分页的效果,很简单设置http的head即prefer,odata.maxpagesize就可以了. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(weburi); req.Credentials = new NetworkC…
通过组织服务中获取实体picklist字段的text和value可以通过RetrieveAttributeRequest实现,但在使用web api的今天该怎么实现,本文即来一探究竟,本篇基于SDK中的Query Metadata using the Web API一节. 首先我们要获取到实体的metadataid,代码如下,这个metadataid后面会用到,我这里用的是account实体 string weburi = WebUri + "EntityDefinitions?$filter=…
CRM2016中新增的web api支持fetch xml了,之前使用FetchXML的场景是在后天代码中通过组织服务的retrieve multiple方法,但实际的应用效果有多大,还需要在实际的项目中去体会了. 上代码,注意要对fetch xml进行编码 var fetch="<fetch mapping='logical'>" +"<entity name='account'>" +"<attribute name='a…
本篇继续来介绍两个web api的接口,一个是"Create related entities in one operation"即在一步操作中完成主实体的创建加关联实体的创建,一个是"Associate entities on create"即在创建记录的时候填充lookup字段. 先来说第一个api,老规矩直接上代码,稍微做下解释,注意下面的几点不存在先后顺序,我只是分开说明罢了 1.这里创建一个account实体记录 2.创建一条名为"John Sm…
在web api中提供了对单个属性的更新接口,这和查询中查询单个属性类似,对这个接口我个人也是比较喜欢的. var id = "{D1E50347-86EB-E511-9414-ADA183AB6249}"; var propertyValue="测试"; $.ajax({ async: false, type: "PUT", contentType: "application/json; charset=utf-8", da…
本篇继续探索web api,介绍如何通过web api更新记录. 下面是一段简单的更新代码,更新了几个不同类型的字段,entity的赋值和前篇创建时候的一样的. var entity = {}; entity["name"] = '测试更新';//文本 entity["new_gender"] = 100000001;//选项集 entity["new_birth"] = new Date();//日期 entity["new_test…
前篇介绍了通过primary key来查询记录,那query的知识点里面还有很多需要学习的,这个有待后面挖掘,本篇来简单介绍下用web api的创建记录. 直接上代码,这里的entity的属性我列了几个比较典型的,和原来相比有区别的是选项集.货币以及lookup字段,其中lookup字段赋值变化最大,new_testid即lookup的字段名,@后面的是标准写法,关联的实体名为new_test,括号里面即关联实体的guid var entity = {}; entity["name"]…
之前的博文中有介绍过,Web Api中的一个删除单个属性的Api但没提供查找字段的删除方法,本篇补充上,这里给出的示例代码是C#的(主要看url的拼接),看下url中最后的/$ref,这个标示表明了当前删除的字段是一个查找类型的,区别就在这. string weburi = System.Configuration.ConfigurationManager.AppSettings["WebUri"] + entityName +"(" + guid.Replace(…
本篇又是一次来谈到CRM中时间字段的问题,那这次要谈的是在引用web api过程中写代码上的注意事项,常用的代码场景即JS和c#. 先来看下js,从下图中可以看到,我直接将new Date()赋值给时间字段时,经过json序列化后会将本地时间转化为国际时间,那如果我的时间字段的行为是无时区,写进后台数据库的就是国际时间那就是错误的,会有8小时的时差. 那怎么办呢,我们想到的简单粗暴的方式就是new Date().toString()这样json处理的是字符串而不是时间就不会减8转化为国际时间了,…
前篇我们论述了时间字段的查询,本篇来论述下时间字段的更新. 还是以之前建的当地时间(时间行为为用户当地时间)字段来测试 可以看到web api更新的是数据库的时间,而在前台的反映就是做了加8处理,所以后期在时间字段的处理上要多加注意,分清楚该之间字段的行为到底是什么.…
我的博文里已经有多次提到CRM中的时间处理问题了,本篇继续探讨在web api的场景下时间字段如何处理,本篇只涉及查询,针对2016中新增的时间行为"用户当地时间"和"无时区"展开. 首先以我客户中的一条数据为例,出生日期为"2016/3/16",类型为"用户当地时间" 但当我以"2016-03-16"作为条件通过web api去查询时,却查不到任何数据(其实这个时候你应该依稀知道和时区有关了) 为了佐证我…
本篇再来介绍个web api的功能,关于lookup的text这里只是略带,因为有expand,现有的web api就能实现,主要提的是选项集的text,我们通过基本的查询api查出来的字段值只带有value,如果想要获取text也很简单,只需要在request的头部加一条信息即可,下面分别给出了C#及JS的示例代码. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(weburi); req.Credentials = new…
相比之前的增改查,删除就显得简单的多了. 这里的request的type为delete,删除成功的status为204,404则是要删除的记录不存在 var id = 'BAD90A95-7FEA-E511-9414-ADA183AB6249'; $.ajax({ async: false, type: "DELETE ", contentType: "application/json; charset=utf-8", url: Xrm.Page.context.g…
之前的博文只介绍了通过记录的primary key来查询单条记录或者单个属性值,本篇介绍多条记录的查询方法 var filter = "?$filter=name eq '123'"; var req = new XMLHttpRequest() req.open("get", Xrm.Page.context.getClientUrl() + "/api/data/v8.0/accounts/" + filter, false); req.se…
之前有篇博文介绍了如何获取查找字段的name值(跳转),本篇在此基础上再延伸下,实现的效果类似于EntityReference,可以取到查找字段的id,name,localname. 这里我以客户实体为例,定义了一个叫new_city的查找字段,现在获取它的值 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://xx/api/data/v8.0/accounts(1D539D5B-D8B2-E611-80EB-C2…
本篇介绍两个关于1:N关系中通过主实体取关联子实体的api,这两个api会经常被用到而且比原来的odata方式更加方便,之前如果我们要取主实体下所有的关联实体的记录都是通过Retrieve Multiple的方式. 直接上代码,注意url最后的写法 var req = new XMLHttpRequest() req.open("get",Xrm.Page.context.getClientUrl() + "/api/data/v8.0/accounts(" +Xr…
本篇介绍两个关于1:N关系中通过主实体取关联子实体的api,这两个api会常常被用到并且比原来的odata方式更加方便.之前假设我们要取主实体下全部的关联实体的记录都是通过Retrieve Multiple的方式. 直接上代码.注意url最后的写法 var req = new XMLHttpRequest() req.open("get",Xrm.Page.context.getClientUrl() + "/api/data/v8.0/accounts(" +Xr…
回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对象进行传递,而这讲主要围绕这个话题来说,接口层添加一个新类User_Info,用来进行数据传递,而客户端使用网页ajax和控制台HttpClient的方式分别进行实现,Follow me! 下面定义一个复杂类型对象 public class User_Info { public int Id { g…
本篇要讲的是dynamics 新版本中web api的一个改进功能,虽然改进的很有限,但至少是改进了. 举个例子,我们现在知道联系人的名字vic,我们想找出客户记录中主要联系人名字为vic的所有客户,按照之前odata的方式,是先根据名字查询出所有叫vic的联系人记录guid,然后在遍历这些联系人guid去查询客户记录.但现在已经是web api的时代,有没有更简便的方式呢?很遗憾在2016里没有. 但在dynamics 365中web api虽说并没有完全解决上述问题,但至少看到了希望. 下面…
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复243或者20170111可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me . Dynamics CRM SDK中的Query Data using the Web API介绍了Web API的使用,提到了标准的过滤操作,包括括号的使用(叫做分组操作符),举得例子是 (contains(name,'sample') or contains(name,'test'))…
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复356或者20190830可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 之前的文章 使用JS通过Web API执行批量操作,多个操作是一个事务!…
前言 上一篇文章我们介绍了关于日志记录用的是Log4net,确实也很挺强大,但是别忘了我们.NET有专属于我们的日志框架,那就是NLog,相对于Log4net而言,NLog可以说也是一个很好的记录日志的框架,并且其中的异步日志等都有非常大的改善,本文借此用了最新的NLog来在Web APi中进行记录日志. NLog 第一步则是下载我们需要的程序包,包括程序集以及配置文件 利用NLog记录日志同样可以实现如我们上篇文章利用Log4net来实现的那样,所以在这里就不多说,下面我们来讲另外一种方式,那…
前言 刚开始表面上感觉Web API内容似乎没什么,也就是返回JSON数据,事实上远非我所想,不去研究不知道,其中的水还是比较深,那又如何,一步一个脚印来学习都将迎刃而解. Self-Host 我们知道Web API它可以快速为HTTP客户端提供API来创建Web服务,为何如此这样说呢?因为我们可以将其作为主机也就是一个服务器来用完全不需要IIS,这就是我们下面要讲的第一个内容Self-Host,实现对Web API寄宿的方式有多种并且都是独立于ASP.NET框架之外,如下Self-Host寄宿…
有时候我们会想给予权限添加 filter 到查询上. 比如 会员和管理员都使用了 /api/products 作为 product 查询 但是会员不应该可以看见还没有上架的货品 /api/products?$filter=onMarket eq true 才是正确的 但是我们当然不可能把这个 $filter 交给前端去限制,因为这不安全嘛. 可惜的是 Web Api 并没有提供比较上层的接口去实现这个方法. 我们有好些方法可以完成上面这个事情 比如在 controller return if(m…
有时候,向服务端请求一个实体,我们希望返回如下的格式: links: [    href: http://localhost:8901/api/user/diaries/2013-08-17,    rel: "self",    method: "GET",    isTemplated: false],currentDate:"2013-08-17" 首先抽象出一个与Link相关的类: public class LinkModel { pub…
并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对象进行传递,而这讲主要围绕这个话题来说,接口层添加一个新类User_Info,用来进行数据传递,而客户端使用网页ajax和控制台HttpClient的方式分别进行实现,Follow me! 下面定义一个复杂类型对象 public class User_Info { public int Id { get; set; } public string Name { get; set; }…
下面定义一个复杂类型对象 public class User_Info { public int Id { get; set; } public string Name { get; set; } public string Info { get; set; } } 下面修改上次的api部分,让它对这个对象进行操作 [CorsAttribute("http://localhost:3321")] public class RegisterController : ApiControll…
原文:http://www.cnblogs.com/lori/p/4045633.html 下面定义一个复杂类型对象 public class User_Info { public int Id { get; set; } public string Name { get; set; } public string Info { get; set; } } 下面修改上次的api部分,让它对这个对象进行操作 [CorsAttribute("http://localhost:3321")]…