Dynamics CRM 2015/2016 Web API:重客户端的CRUD操作
2015-10-23 15:55
555 查看
在向大家介绍了两篇比较概念化的文章后,我们今天来看看一些具体的Web API编程实例吧,在本文中,我讲向大家介绍怎么在重客户端下面调用CRM Web API完成基本的CRUD操作。 什么是重客户端呢?哈哈,这个词是我自己发明的,用了表示那些非浏览器脚本的API消费者,例如:使用C#代码做的数据接口,中间服务等。
那么重客户端和那些轻客户端(浏览器脚本)有什么本质的区别吗?就我来看,最大的区别莫过于在重客户端编程我们需要考虑API的验证与授权部分,但是在轻客户端,我们则不需要。使用过Dynamics CRM里面使用过REST接口进行编程的同学可能已经意识到,如果我们仅仅在浏览器脚本(不涉及跨域)上调用API,我们是不需要涉及任何权限验证和授予的过程。
在重客户端中使用Web API对CRM进行事务操作,一共有两个难点:其一,需要构造JSON格式的输入参数,其二,需要构造符合规则的Odata URL。对于前者,我们可以使用JSON序列化类库进行操作,至于后者,我们可以参考官方的SDK进行URL的构造。
在进行编程前,首先保证你的项目里面已经引用了如下的类库,如果没有,可以使用NuGet进行安装(搜索ID名称,例如:Newtonsoft.Json)
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.19.208020213" targetFramework="net452" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net452" />
<package id="System.Net.Http" version="2.0.20126.16343" targetFramework="net452" />
<package id="System.Net.Http.Formatting.Extension" version="5.2.3.0" targetFramework="net452" />
</packages>
在进行具体的功能实现前,大家需要使用上篇博文中的验证辅助类来生成AccessToken,然后我们才能进行具体的业务实现。
首先,我们生成AccessToken,然后将其赋给HttpClient对象,这样服务器才能识别该次请求为授权请求,下面的代码片段是对Account进行Create操作
Authentication auth = new Authentication(clientId, service, redirectUrl, username, password);
//create an account
JObject acc = new JObject();
acc.Add("name", "this account was created by WEB API");
HttpRequestMessage createReq = new HttpRequestMessage(HttpMethod.Post, string.Format("api/data/accounts"));
createReq.Content = new StringContent(JsonConvert.SerializeObject(acc), Encoding.UTF8, "application/json");
createReq.Headers.Authorization = new AuthenticationHeaderValue("Bearer", auth.AcquireToken().AccessToken);
HttpResponseMessage createResponse = await client.SendAsync(createReq).ConfigureAwait(false);
string accountUri = string.Empty;
if (createResponse.IsSuccessStatusCode)
{
var result = await createResponse.Content.ReadAsStringAsync();
accountUri = createResponse.Headers.GetValues("OData-EntityId").FirstOrDefault();
}
读取操作也是非常的简单,基本和REST QUERY URL一致,但是这套新API还是简化了一些繁琐的URL格式,例如按ID查询客户记录:老API - http://server/AccountSet(guid 'xxxxx-xxxx-xxx-xxxx'), 新API - http://server/AccountSet('xxxx-xxxx-xxxx-xxx')。是不是简单干脆呢,大爱 :D
更新操作也是有很大的改进的,新API摒弃了之前的一些莫名其妙的客户端数据类型,例如:Mony,OptionsSetValue。取而代之的是简洁明了的基础数据结构:整型,浮点型。 另外一个变化最大的就是EntityReference类型啦,在这套API中,我们使用‘ Navigation' 这样的数据结构,确实别扭。
//update an account
if (!string.IsNullOrEmpty(accountUri))
{
HttpRequestMessage uptReq = new HttpRequestMessage(new HttpMethod("PATCH"), accountUri);
JObject uptAcc = new JObject();
uptAcc.Add("telephone1", "12345"); //text
uptAcc.Add("account_primary_contact@odata.bind", "https://server/api/data/contacts(d870721c-bf64-e511-80f0-c4346bc43f98)"); //lookup
uptAcc.Add("donotemail", false); //bool
uptAcc.Add("address1_shippingmethodcode", 3); //optionset
uptAcc.Add("new_testcurrency", 500.51);
uptAcc.Add("new_testdecimal", 1000.1);
uptAcc.Add("new_testfloat", 2000.2);
uptAcc.Add("new_testtime", DateTime.Now);
uptAcc.Add("new_testwholenumber", 5000);
uptReq.Headers.Authorization = new AuthenticationHeaderValue("Bearer",auth.AcquireToken().AccessToken);
uptReq.Content = new StringContent(JsonConvert.SerializeObject(uptAcc), Encoding.UTF8, "application/json");
HttpResponseMessage uptResp = await client.SendAsync(uptReq);
if (uptResp.IsSuccessStatusCode)
{
Console.WriteLine("Update Successfully");
}
}
删除操作,简洁明了,这里的accountUrl的格式为该类型’ https://server/api/data/contacts(d870721c-bf64-e511-80f0-c4346bc43f98)
//delete an account
if (!string.IsNullOrEmpty(accountUri))
{
HttpRequestMessage delReq = new HttpRequestMessage(HttpMethod.Delete, accountUri);
delReq.Headers.Authorization = new AuthenticationHeaderValue("Bearer", auth.AcquireToken().AccessToken);
HttpResponseMessage delResp = await client.SendAsync(delReq);
if (delResp.IsSuccessStatusCode)
{
Console.WriteLine("Delete Successfully");
}
}
好啦,今天就介绍到这里,接下来,我会给大家介绍下怎么在重客户端下调用Unbount Function 和 Action。
那么重客户端和那些轻客户端(浏览器脚本)有什么本质的区别吗?就我来看,最大的区别莫过于在重客户端编程我们需要考虑API的验证与授权部分,但是在轻客户端,我们则不需要。使用过Dynamics CRM里面使用过REST接口进行编程的同学可能已经意识到,如果我们仅仅在浏览器脚本(不涉及跨域)上调用API,我们是不需要涉及任何权限验证和授予的过程。
在重客户端中使用Web API对CRM进行事务操作,一共有两个难点:其一,需要构造JSON格式的输入参数,其二,需要构造符合规则的Odata URL。对于前者,我们可以使用JSON序列化类库进行操作,至于后者,我们可以参考官方的SDK进行URL的构造。
在进行编程前,首先保证你的项目里面已经引用了如下的类库,如果没有,可以使用NuGet进行安装(搜索ID名称,例如:Newtonsoft.Json)
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="2.19.208020213" targetFramework="net452" />
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net452" />
<package id="System.Net.Http" version="2.0.20126.16343" targetFramework="net452" />
<package id="System.Net.Http.Formatting.Extension" version="5.2.3.0" targetFramework="net452" />
</packages>
在进行具体的功能实现前,大家需要使用上篇博文中的验证辅助类来生成AccessToken,然后我们才能进行具体的业务实现。
首先,我们生成AccessToken,然后将其赋给HttpClient对象,这样服务器才能识别该次请求为授权请求,下面的代码片段是对Account进行Create操作
Authentication auth = new Authentication(clientId, service, redirectUrl, username, password);
//create an account
JObject acc = new JObject();
acc.Add("name", "this account was created by WEB API");
HttpRequestMessage createReq = new HttpRequestMessage(HttpMethod.Post, string.Format("api/data/accounts"));
createReq.Content = new StringContent(JsonConvert.SerializeObject(acc), Encoding.UTF8, "application/json");
createReq.Headers.Authorization = new AuthenticationHeaderValue("Bearer", auth.AcquireToken().AccessToken);
HttpResponseMessage createResponse = await client.SendAsync(createReq).ConfigureAwait(false);
string accountUri = string.Empty;
if (createResponse.IsSuccessStatusCode)
{
var result = await createResponse.Content.ReadAsStringAsync();
accountUri = createResponse.Headers.GetValues("OData-EntityId").FirstOrDefault();
}
读取操作也是非常的简单,基本和REST QUERY URL一致,但是这套新API还是简化了一些繁琐的URL格式,例如按ID查询客户记录:老API - http://server/AccountSet(guid 'xxxxx-xxxx-xxx-xxxx'), 新API - http://server/AccountSet('xxxx-xxxx-xxxx-xxx')。是不是简单干脆呢,大爱 :D
//read an account if (!string.IsNullOrEmpty(accountUri)) { HttpRequestMessage getReq = new HttpRequestMessage(HttpMethod.Get, accountUri); getReq.Headers.Authorization = new AuthenticationHeaderValue("Bearer", auth.AcquireToken().AccessToken); HttpResponseMessage getResp = await client.SendAsync(getReq); if (getResp.IsSuccessStatusCode) { JObject retrievedAcc = JsonConvert.DeserializeObject<JObject>(await getResp.Content.ReadAsStringAsync()); if (retrievedAcc != null) { Console.WriteLine(retrievedAcc["name"]); } } }
更新操作也是有很大的改进的,新API摒弃了之前的一些莫名其妙的客户端数据类型,例如:Mony,OptionsSetValue。取而代之的是简洁明了的基础数据结构:整型,浮点型。 另外一个变化最大的就是EntityReference类型啦,在这套API中,我们使用‘ Navigation' 这样的数据结构,确实别扭。
//update an account
if (!string.IsNullOrEmpty(accountUri))
{
HttpRequestMessage uptReq = new HttpRequestMessage(new HttpMethod("PATCH"), accountUri);
JObject uptAcc = new JObject();
uptAcc.Add("telephone1", "12345"); //text
uptAcc.Add("account_primary_contact@odata.bind", "https://server/api/data/contacts(d870721c-bf64-e511-80f0-c4346bc43f98)"); //lookup
uptAcc.Add("donotemail", false); //bool
uptAcc.Add("address1_shippingmethodcode", 3); //optionset
uptAcc.Add("new_testcurrency", 500.51);
uptAcc.Add("new_testdecimal", 1000.1);
uptAcc.Add("new_testfloat", 2000.2);
uptAcc.Add("new_testtime", DateTime.Now);
uptAcc.Add("new_testwholenumber", 5000);
uptReq.Headers.Authorization = new AuthenticationHeaderValue("Bearer",auth.AcquireToken().AccessToken);
uptReq.Content = new StringContent(JsonConvert.SerializeObject(uptAcc), Encoding.UTF8, "application/json");
HttpResponseMessage uptResp = await client.SendAsync(uptReq);
if (uptResp.IsSuccessStatusCode)
{
Console.WriteLine("Update Successfully");
}
}
删除操作,简洁明了,这里的accountUrl的格式为该类型’ https://server/api/data/contacts(d870721c-bf64-e511-80f0-c4346bc43f98)
//delete an account
if (!string.IsNullOrEmpty(accountUri))
{
HttpRequestMessage delReq = new HttpRequestMessage(HttpMethod.Delete, accountUri);
delReq.Headers.Authorization = new AuthenticationHeaderValue("Bearer", auth.AcquireToken().AccessToken);
HttpResponseMessage delResp = await client.SendAsync(delReq);
if (delResp.IsSuccessStatusCode)
{
Console.WriteLine("Delete Successfully");
}
}
好啦,今天就介绍到这里,接下来,我会给大家介绍下怎么在重客户端下调用Unbount Function 和 Action。
相关文章推荐
- 绑定器
- 关于mysql的emoji表情问题(服务器node)
- block循环引用
- maven引入log4j-1.2.15,出错Multiple annotations found at this line:
- 转: RSA原理 阮一峰的博客
- 微信“无法回答问题设置”失效
- 内部排序
- highCharts tootip 内容太长,自动换行.
- Django模板标签中使用js变量
- PHP框架CodeIgniter入门使用(2)
- Android BitmapShader 实战 实现圆形、圆角图片
- 07版去掉页眉文字下的横线
- OpenGL ES中的顶点数组、顶点属性、缓冲区对象
- Undefined symbols for architecture i386: "_OBJC_CLASS_$_KKGridView", referenced from:
- shell脚本在执行时,向脚本传递参数
- 限制EditText 输入Emjoy 表情符号
- Unity编译器VS下Shader高亮插件NShader安装
- 出现错误ActivityManager: Warning: Activity not started
- IOS Sent Events 事件
- 《关于VirtualBox在桥接模式下无法联网 解决方案》