Dynamics CRM 2011编程系列(60):JS编程之CRUD辅助类(JQuery版)

时间:2022-11-09 00:24:38

    今天给大家分享一个JQuery版的REST辅助类,在一年前我分享过一个只能在IE环境下运行的REST辅助类:《JS编程之实体CRUD辅助类 》。为什么要推出JQuery版的CRUD辅助类呢?  原因有三:其一为Dynamics CRM兼容多种浏览器已经成为了一个不争的事实;其二为JQuery在Dynamics CRM 2013中已经被原生支持;其三为可以省去对json.js文件的引用。

    新版本的辅助类还添加了4个CRUD的异步方法,这样咱们的这个辅助类就同时支持异步和同步的CRUD操作啦,该辅助类的代码如下:

Update History

2014/5/28 增加Execute 和 ExecuteAsync 方法。

SOURCE CODE

/*
作者:GhostBear
博客: http://blog.csdn.net/ghostbear
简介:REST中的CRUD操作辅助脚本。
*/

function RESTHelper() { }
function SOAPHelper() { }


/*
方法简介:通过REST对Dynamics CRM 中的实体进行Create操作。
输入参数:
createurl:调用Dynamics CRM数据服务的URL字符串。例如:"/GH2011/XRMServices/2011/OrganizationData.svc/ContactSet"
jsondata:需要进行Create操作的对象,必须进行json序列化。
输出参数:
true:Create成功。
false:Create失败。

*/
RESTHelper.prototype.Create = function (createurl, jsondata) {
var isCreated = false;
$.ajax({
headers: {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'Content-Length': jsondata.length
},
type: 'POST',
url: createurl,
async: false,
cache: false,
data: jsondata,
complete: function (context, result) {
if (result.toLowerCase() == 'success') {
isCreated = true;
}
}
});//ajax
return isCreated;

}

/*
方法简介:通过REST对Dynamics CRM 中的实体进行Create操作。
输入参数:
createurl:调用Dynamics CRM数据服务的URL字符串。例如:"/GH2011/XRMServices/2011/OrganizationData.svc/ContactSet"
jsondata:需要进行Create操作的对象,必须进行json序列化。可以用JQuery自带的序列话工具进行序列化:$.ajax.parseJSON(data)
callbackhandler: 该回调函数应该遵循如下格式:
function callbackhandler(results,entity)
{
if(results==false)
{
//调用失败
}
else
{
//调用成功
}
}
输出参数:


*/
RESTHelper.prototype.CreateAsync = function (createurl, jsondata, callbackhandler) {
$.ajax({
headers: {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'Content-Length': jsondata.length
},
type: 'POST',
url: createurl,
async: true,
cache: false,
data: jsondata,
complete: function (context, result) {
var isCreated = false;
var entity = null;
if (result.toLowerCase() == 'success') {
isCreated = true;
try { entity = $.parseJSON(context.responseText).d; } catch (e) { }
}
callbackhandler(isCreate, entity);
}
});//ajax
}





/*

方法简介:通过REST对Dynamics CRM 中的实体进行Read操作。
输入参数:
queryurl:调用Dynamics CRM数据服务的URL字符串。例如:"/GH2011/XRMServices/2011/OrganizationData.svc/ContactSet(guid'{B75B220A-D2A4-48F4-8002-D8B564A866EA}')"
输出参数:
Object:获得了返回值
Null:查询失败。
*/
RESTHelper.prototype.Read = function (queryurl) {
var data = null;
$.ajax({
headers: { Accept: 'application/json', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': 0 },
type: 'GET',
url: queryurl,
async: false,
cache: false,
complete: function (context, result) {
if (result.toLowerCase() == 'success') {
try { data = $.parseJSON(context.responseText).d; } catch (e) { }
}
}
});//ajax
return data;

}

/*

方法简介:通过REST对Dynamics CRM 中的实体进行异步的Read操作。
输入参数:
queryurl:调用Dynamics CRM数据服务的URL字符串。例如:"/GH2011/XRMServices/2011/OrganizationData.svc/ContactSet(guid'{B75B220A-D2A4-48F4-8002-D8B564A866EA}')"
callbackhandler: 该回调函数应该遵循如下格式:
function callbackhandler(results)
{
if(results==null)
{
//调用失败
}
else
{
//调用成功
}
}
输出参数:

*/
RESTHelper.prototype.ReadAsync = function (queryurl, callbackhandler) {
$.ajax({
headers: { Accept: 'application/json', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': 0 },
type: 'GET',
url: queryurl,
async: true,
cache: false,
complete: function (context, result) {
var data = null;
if (result.toLowerCase() == 'success') {
try {
data = $.parseJSON(context.responseText).d;
} catch (e) { }
}
callbackhandler(data);
}
});//ajax
}



/*
简介:通过REST方式更新实体。
输入参数描述:
updateurl:"/GH2011/XRMServices/2011/OrganizationData.svc/OpportunitySet(guid'{DA83B96B-DBAF-4F0C-A75D-7203F2502087}')"
entity: 需要更新的对象,对象必须为JASON格式。
输出参数:
更新成功返回:true
更新失败返回:false
*/
RESTHelper.prototype.Update = function (updateurl, jsondata) {
var isUpdated = false;
$.ajax({
headers: {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'Content-Length': jsondata.length,
'X-HTTP-Method': 'MERGE'
},
type: 'POST',
url: updateurl,
async: false,
cache: false,
data: jsondata,
complete: function (context, result) {
if (result.toLowerCase() == 'success') {
isUpdated = true;
}
}
});//ajax
return isUpdated;

}

/*
简介:通过REST方式更新实体。
输入参数描述:
updateurl:"/GH2011/XRMServices/2011/OrganizationData.svc/OpportunitySet(guid'{DA83B96B-DBAF-4F0C-A75D-7203F2502087}')"
jsondata:需要进行Create操作的对象,必须进行json序列化。可以用JQuery自带的序列话工具进行序列化:$.ajax.parseJSON(data)
callbackhandler: 该回调函数应该遵循如下格式:
function callbackhandler(results)
{
if(results==false)
{
//调用失败
}
else
{
//调用成功
}
}
输出参数:

*/
RESTHelper.prototype.UpdateAsync = function (updateurl, jsondata, callbackhandler) {
$.ajax({
headers: {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'Content-Length': jsondata.length,
'X-HTTP-Method': 'MERGE'
},
type: 'POST',
url: updateurl,
async: true,
cache: false,
data: jsondata,
complete: function (context, result) {
var isUpdated = false;
if (result.toLowerCase() == 'success') {
isUpdated = true;
}
callbackhandler(isUpdated);
}
});//ajax
}





/*
简介:通过REST方式删除实体。
参数描述:
deleteurl:"/GH2011/XRMServices/2011/OrganizationData.svc/ContactSet(guid'{DA83B96B-DBAF-4F0C-A75D-7203F2502087}')"
返回类型:
删除成功返回:true
删除失败返回:false
*/
RESTHelper.prototype.Delete = function (deleteurl) {
var isDeleted = false;
$.ajax({
headers: {
Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8',
'X-HTTP-Method': 'DELETE'
},
type: 'POST',
url: deleteurl,
async: false,
cache: false,
data: null,
complete: function (context, result) {
if (result.toLowerCase() == 'success') {
isDeleted = true;
}
}
});//ajax
return isDeleted;
}

/*
简介:通过REST方式删除实体。
参数描述:
deleteurl:"/GH2011/XRMServices/2011/OrganizationData.svc/ContactSet(guid'{DA83B96B-DBAF-4F0C-A75D-7203F2502087}')"
callbackhandler: 该回调函数应该遵循如下格式:
function callbackhandler(results)
{
if(results==false)
{
//调用失败
}
else
{
//调用成功
}
}
输出参数:

*/
RESTHelper.prototype.DeleteAsync = function (deleteurl, callbackhandler) {
$.ajax({
headers: {
Accept: 'application/json',
'Content-Type': 'application/soap+xml; charset=utf-8',
'X-HTTP-Method': 'DELETE'
},
type: 'POST',
url: deleteurl,
async: false,
cache: false,
data: null,
complete: function (context, result) {
var isDeleted = false;
if (result.toLowerCase() == 'success') {
isDeleted = true;
}
callbackhandler(isDeleted);
}
});//ajax
}




/*
方法简介:执行Organization Service 的消息。
输入参数:
orgUrl:调用Dynamics CRM数据服务的URL字符串。例如:"/GH2011/XRMServices/2011/Organization.svc"
msg:soap message
输出参数:
true:Execute成功。
false:Execute失败。

*/
SOAPHelper.prototype.Execute = function (orgUrl, msg) {
var isCreated = false;
$.ajax({
headers: {
Accept: 'application/xml, text/xml, */*',
'Content-Type': 'application/soap+xml; charset=utf-8',
'SOAPAction': 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute'
},
type: 'POST',
url: orgUrl,
async: false,
cache: false,
data: msg,
complete: function (context, result) {
if (result.toLowerCase() == 'success') {
isCreated = true;
}
}
});//ajax
return isCreated;
}

/*
方法简介:异步执行Organization Service 的消息。
输入参数:
orgUrl:调用Dynamics CRM数据服务的URL字符串。例如:"/GH2011/XRMServices/2011/Organization.svc"
msg:soap message
callbackhandler: 该回调函数应该遵循如下格式:
function callbackhandler(results,context)
{
if(results==false)
{
//调用失败
}
else
{
//调用成功
}
}
输出参数:


*/
SOAPHelper.prototype.ExecuteAsync = function (orgUrl, msg, callbackhandler) {
$.ajax({
headers: {
Accept: 'application/xml, text/xml, */*',
'Content-Type': 'text/xml; charset=utf-8',
'SOAPAction': 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute'
},
type: 'POST',
url: orgUrl,
async: true,
cache: false,
data: msg,
complete: function (context, result) {
var isSuccess = false;
var entity = null;
if (result.toLowerCase() == 'success') {
isSuccess = true;

}
callbackhandler(isSuccess, context.responseText);
}
});//ajax
}


 

TEST CASE

function Test_RESTHelper() {    var Helper = new RESTHelper();    var isok;    var id = "";    var entitySet=""    //path    var createurl = "/example/XRMServices/2011/OrganizationData.svc/"+entitySet;    var updateurl = "/example/XRMServices/2011/OrganizationData.svc/"+entitySet+"(guid'"+id+"')";    var queryurl = "/example/XRMServices/2011/OrganizationData.svc/"+entitySet+"(guid'"+id+"')";    var querymultipleurl = "/example/XRMServices/2011/OrganizationData.svc/"+entitySet;    var deleteurl = "/example/XRMServices/2011/OrganizationData.svc/"+entitySet+"(guid'"+id+"')";    //Create        //sync        var myAccount = new Object();        myAccount.new_name= "TestRESTHelper";        isok = Helper.Create(createurl, JSON.stringify(myAccount));        alert("Create:" + isok.toString());        //async        var myAccount = new Object();        myAccount.new_name = "TestRESTHelper";        isok = Helper.CreateAsync(createurl, JSON.stringify(myAccount), CreateCompleteHandler);    //Update        //sync        myAccount = new Object();        myAccount.new_name = "new_TestRESTHelper";        isok = Helper.UpdateAsync(updateurl, JSON.stringify(myAccount));        alert("update:" + isok.toString());        //async        myAccount = new Object();        myAccount.new_name = "new_TestRESTHelper";        isok = Helper.UpdateAsync(updateurl, JSON.stringify(myAccount), UpdateCompleteHandler);    //Read    //获取单条记录          //sync        var data = Helper.Read(queryurl);        alert(data.new_name);        //async        var data = Helper.ReadAsync(queryurl, QueryCompleteHandler);    //获取多记录       //sync        var data = Helper.ReadAsync(querymultipleurl);        var result = "";        var tmp;        for (tmp in data.results) {            result += data.results[tmp].new_name+ "\n";        }        alert(result);        //async        var data = Helper.ReadAsync(querymultipleurl, MultipleQueryCompleteHandler);    //Delete        //sync        isok = Helper.DeleteAsync(deleteurl);        alert("Delete:" + isok.toString());        //async        isok = Helper.DeleteAsync(deleteurl, DeleteCompleteHandler);}function CreateCompleteHandler(results,entity) {    alert('create:' + results.toString());}function UpdateCompleteHandler(results) {    alert('update:' + results.toString());}function DeleteCompleteHandler(results) {    alert('delete:' + results.toString());}function QueryCompleteHandler(results) {    if (results != null) {        alert(results.new_name);    }    else {        alert('fault');    }}function MultipleQueryCompleteHandler(results) {    if (results != null) {        alert(results.results[0].new_name);    }    else {        alert('fault');    }}var msg="<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><request i:type=\"b:AssignRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\"><a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\"><a:KeyValuePairOfstringanyType><c:key>Target</c:key><c:value i:type=\"a:EntityReference\"><a:Id>00e9c04c-12c0-de11-a517-00155d00fc05</a:Id><a:LogicalName>account</a:LogicalName><a:Name i:nil=\"true\" /></c:value></a:KeyValuePairOfstringanyType><a:KeyValuePairOfstringanyType><c:key>Assignee</c:key><c:value i:type=\"a:EntityReference\"><a:Id>56c29177-6e9f-e311-80dc-00155dc6cd1c</a:Id><a:LogicalName>systemuser</a:LogicalName><a:Name i:nil=\"true\" /></c:value></a:KeyValuePairOfstringanyType></a:Parameters><a:RequestId i:nil=\"true\" /><a:RequestName>Assign</a:RequestName></request></Execute></s:Body></s:Envelope>";     var orgUrl="http://crmserver:5555/example/XRMServices/2011/Organization.svc/web";     var helper2=new SOAPHelper();     helper2.Execute(orgUrl,msg);     helper2.ExecuteAsync(orgUrl,msg,executeCallback);


注意

   在Dynamics CRM 2011环境中使用该辅助类需要先引用JQuery类库