此 MSDN 文章的“捕获示例 HTTP 请求和响应”部分概述了如何获取从托管代码发送到 CRM 2011 的 SOAP 消息。
这篇 MSDN 文章的“执行查询”部分提供了一个在托管代码中使用 2011 年的 IOrganizationService.RetrieveMultiple 来执行 FetchXML 查询的示例。
使用这两个示例,您可以为 RetrieveMultiple 提取包含 FetchXML 查询的示例 SOAP 消息。
第一篇 MSDN 文章的“创建 JScript 库”部分展示了如何在 JavaScript 中针对 2011 SOAP 端点执行执行请求。将此示例中的分配 SOAP 请求替换为您通过执行托管代码获得的 RetrieveMultiple SOAP 消息。
这使您能够在 JavaScript 中针对 2011 SOAP 端点执行 FetchXML 请求。
以下是我使用上述信息编写的 JavaScript 库的一些片段:
(function (window, undefined) {
var _window = undefined;
if (window.Xrm)
_window = window;
else if (window.parent.Xrm)
_window = window.parent;
else throw new Error("Unable to determine proper window");
(function (Crm) {
(function (Service, $, JSON, Xrm) {
if (!Xrm)
throw new Error("Unable to locate Xrm");
if (!JSON)
throw new Error("Unable to locate JSON");
if (!$)
throw new Error("Unable to locate jQuery");
Service.Create = function (ODataSetName, EntityObject) {
if (!EntityObject) {
throw new Error("EntityObject is a required parameter");
return;
}
if (!ODataSetName) {
throw new Error("ODataSetName is a required parameter");
return;
}
var jsonEntityObject = JSON.stringify(EntityObject);
var req = new XMLHttpRequest();
req.open("POST", Service.GetODataEndPoint() + "/" + ODataSetName, false);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function () {
debuggingCallBack(this);
};
req.send(jsonEntityObject);
};
function debuggingCallBack(req) {
if (req.readyState == 4 /* complete */) {
if (req.status == 201 || req.status == 204 || req.status == 1223) {
//Success
//201 = create
//204 = update
//1223 = delete
}
else {
//Failure
debugger;
}
}
};
Service.Fetch = function (FetchXML) {
var request = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
request += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
request += "<s:Body>";
request += "<RetrieveMultiple xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
request += "<query i:type=\"a:FetchExpression\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
request += "<a:Query>";
request += Service.FetchEncode(FetchXML);
request += "</a:Query>";
request += "</query>";
request += "</RetrieveMultiple>";
request += "</s:Body>";
request += "</s:Envelope>";
var req = new XMLHttpRequest();
req.open("POST", Service.GetSOAPEndPoint(), false)
req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple");
req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
req.setRequestHeader("Content-Length", request.length);
req.send(request);
results = Service.GetResults(req.responseXML);
return results;
};
Service.Delete = function (ODataSetName, EntityID) {
if (!EntityID) {
throw new Error("EntityID is a required parameter");
return;
}
if (!ODataSetName) {
throw new Error("ODataSetName is a required parameter");
return;
}
var req = new XMLHttpRequest();
req.open("POST", Service.GetODataEndPoint() + "/" + ODataSetName + "(guid'" + EntityID + "')", false)
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("X-HTTP-Method", "DELETE");
req.onreadystatechange = function () {
debuggingCallBack(this);
};
req.send();
};
Service.GetServerUrl = function () {
var serverUrl = null;
serverUrl = Xrm.Page.context.getServerUrl();
if (serverUrl.match(/\/$/)) {
serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}
return serverUrl;
};
Service.GetODataEndPoint = function () {
return Service.GetServerUrl() + "/XRMServices/2011/OrganizationData.svc";
};
Service.GetSOAPEndPoint = function () {
return Service.GetServerUrl() + "/XRMServices/2011/Organization.svc/web";
};
Service.GetResults = function (responseXML) {
var sFetchResult = responseXML.selectSingleNode("//RetrieveMultipleResult").xml;
var oResultDoc = new ActiveXObject("Microsoft.XMLDOM");
oResultDoc.async = false;
oResultDoc.loadXML(sFetchResult);
var oResults = new Array(oResultDoc.firstChild.firstChild.childNodes.length);
var iLen = oResultDoc.firstChild.firstChild.childNodes.length;
for (var i = 0; i < iLen; i++) {
var oResultNode = oResultDoc.firstChild.firstChild.childNodes[i];
var oBE = new BusinessEntity(oResultNode.selectSingleNode("//a:LogicalName").text);
var iLenInner = oResultNode.firstChild.childNodes.length;
for (var j = 0; j < iLenInner; j++) {
var oRA = new Object();
var value = null;
if (oResultNode.firstChild.childNodes[j].lastChild.childNodes.length == 3) {
if (oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Id").length == 1)
value = oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Id")[0].text;
if (oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Value").length == 1)
value = oResultNode.firstChild.childNodes[j].lastChild.getElementsByTagName("a:Value")[0].text;
}
if (!value)
value = oResultNode.firstChild.childNodes[j].lastChild.text;
oRA["value"] = value;
oBE.attributes[oResultNode.firstChild.childNodes[j].firstChild.firstChild.text] = oRA;
}
oResults[i] = oBE;
}
return oResults;
};
Service.BusinessEntity = function BusinessEntity(sName) {
this.name = sName;
this.attributes = new Object();
};
Service.FetchEncode = function (FetchXML) {
var c;
var HtmlEncode = '';
if (FetchXML == null) {
return null;
}
if (FetchXML == '') {
return '';
}
for (var cnt = 0; cnt < FetchXML.length; cnt++) {
c = FetchXML.charCodeAt(cnt);
if (((c > 96) && (c < 123)) ||
((c > 64) && (c < 91)) ||
(c == 32) ||
((c > 47) && (c < 58)) ||
(c == 46) ||
(c == 44) ||
(c == 45) ||
(c == 95)) {
HtmlEncode = HtmlEncode + String.fromCharCode(c);
}
else {
HtmlEncode = HtmlEncode + '&#' + c + ';';
}
}
return HtmlEncode;
};
} (Crm.Service = Crm.Service || {}, _window.jQuery, _window.JSON, _window.Xrm));
} (_window.Crm = _window.Crm || {}));
} (window));