The "Capture Sample HTTP Request and Response" section of this MSDN article outlines how to get a SOAP message that is sent to CRM 2011 from managed code.
The "Execute the Query" section of this MSDN article gives an example of using 2011's IOrganizationService.RetrieveMultiple in managed code to execute a FetchXML query.
Using both of these samples, you can extract a sample SOAP message for RetrieveMultiple that contains a FetchXML query.
The "Create a JScript Library" section of the first MSDN article shows how to perform an Execute request in JavaScript against the 2011 SOAP endpoint. Replace the Assign SOAP request in this example with the RetrieveMultiple SOAP message that you get from executing the managed code.
This enables you to execute a FetchXML request in JavaScript against the 2011 SOAP endpoint.
Here are some snippets from a JavaScript library I wrote using the information above:
(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));