Веб-приложение для выполнения Fetch-запроса
Небольшое приложение, оформленное в виде HTML Веб-ресурса, позволяющего через JS выполнять Fetch-запроса.
Создайте JS Веб-ресурс с таким кодом:
var XMLHTTPSUCCESS = 200; var XMLHTTPREADY = 4; function FetchUtil(sOrg, sServer) { this.org = sOrg; this.server = sServer; if (sOrg == null) { if (typeof (ORG_UNIQUE_NAME) != "undefined") { this.org = ORG_UNIQUE_NAME; } } if (sServer == null) { this.server = window.location.protocol + "//" + window.location.host; } } FetchUtil.prototype._ExecuteRequest = function (sXml, sMessage, fInternalCallback, fUserCallback) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", this.server + "/XRMServices/2011/Organization.svc/web", (fUserCallback != null)); xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*"); xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"); if (fUserCallback != null) { // Регистрируем callback-функцию для асинхронного вызова var crmServiceObject = this; xmlhttp.onreadystatechange = function () { fInternalCallback.call(crmServiceObject, xmlhttp, fUserCallback) }; xmlhttp.send(sXml); } else { // Для синхронного вызова отправляем запрос и вручную вызываем callback-функцию xmlhttp.send(sXml); return fInternalCallback.call(this, xmlhttp, null); } } FetchUtil.prototype._HandleErrors = function (xmlhttp) { /// Управление ошибками if (xmlhttp.status != XMLHTTPSUCCESS) { var sError = "Error: " + xmlhttp.responseText + " " + xmlhttp.statusText; alert(sError); return true; } else { return false; } } FetchUtil.prototype.Fetch = function (sFetchXml, fCallback) { // Выполняем FetchXml-запрос var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"; request += "<s:Body>"; request += '<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services">' + '<request i:type="b:RetrieveMultipleRequest" ' + ' xmlns:b="http://schemas.microsoft.com/xrm/2011/Contracts" ' + ' xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' + '<b:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">' + '<b:KeyValuePairOfstringanyType>' + '<c:key>Query</c:key>' + '<c:value i:type="b:FetchExpression">' + '<b:Query>'; request += CrmEncodeDecode.CrmXmlEncode(sFetchXml); request += '</b:Query>' + '</c:value>' + '</b:KeyValuePairOfstringanyType>' + '</b:Parameters>' + '<b:RequestId i:nil="true"/>' + '<b:RequestName>RetrieveMultiple</b:RequestName>' + '</request>' + '</Execute>'; request += '</s:Body></s:Envelope>'; return this._ExecuteRequest(request, "Fetch", this._FetchCallback, fCallback); } FetchUtil.prototype._FetchCallback = function (xmlhttp, callback) { // Функция обратного вызова if (xmlhttp.readyState != XMLHTTPREADY) { return; } // Проверяем ошибки if (this._HandleErrors(xmlhttp)) { return; } var xmlReturn = xmlhttp.responseXML.xml; xmlReturn = xmlReturn.replace(/</g, '<'); xmlReturn = xmlReturn.replace(/>/g, '>'); results = xmlReturn; // Возвращаем entityid для синхронного запросп или вызыванм callback-функцию для асинхронного запроса if (callback != null) { callback(results); } else { return results; } }
Этот код создаст XML SOAP и отправляет на выполнение в CRM.
Создайте HTML Веб-ресурс fetchExample.htm с таким кодом:
<html> <head> <title>Fetch Request</title> <link rel="stylesheet" type="text/css" href="/_common/styles/theme.css.aspx" /> <link rel="stylesheet" type="text/css" href="/_common/styles/global.css.aspx" /> <link rel="stylesheet" type="text/css" href="/_common/styles/fonts.css.aspx" /> <link rel="stylesheet" type="text/css" href="/_common/styles/Dialogs.css.aspx" /> <script src="ClientGlobalContext.js.aspx"></script> <script src="new_FetchUtil.js"></script> <script type="text/javascript"> _Result = ""; var _oService; var _sOrgName = GetGlobalContext().getOrgUniqueName(); var _sServerUrl = GetGlobalContext().getServerUrl(); function executeFetchCommand() { var sFetch = document.getElementById('txtFetch').value; _oService = new FetchUtil(_sOrgName, _sServerUrl); var oEntity = _oService.Fetch(sFetch, myCallBack); } function myCallBack(results) { _Result = results; var sOut = ""; sOut += "<b>XML ответ</b><br />"; sOut += results; document.getElementById('dvData').innerHTML = sOut; } function copyToClipboard() { window.clipboardData.setData("Text", _Result); } </script> </head> <body> <table style="width: 100%; height: 100%;" cellspacing="0" cellpadding="0" border="0"> <tr> <td class="ms-crm-Dialog-Header" id="tdDialogHeader"> <div id="divTitle" class="ms-crm-Dialog-Header-Title">Выполнение Fetch-запросов с помощью JS в CRM 2011</div> <div id="divInstructions" class="ms-crm-Dialog-Header-Desc">Введите какой-нибудь FetchXML, который необходимо выполнить в Вашем CRM развертывании</div> </td> </tr> <tr> <td style="height: 100%;"> <div class="ms-crm-Dialog-Main" style="padding: 14px;"> <label>Fetch-запрос</label><br /> <textarea id="txtFetch" rows="8" width="100%" cols="100" ></textarea><br /> <input type="Submit" value="Выполнить запрос" onClick="javascript: executeFetchCommand();" style="width:150px;" class="ms-crm-Button"> <div id='dvData' style="width: 100%; height: 100%;"></div> </div> </td> </tr> <tr> <td class="ms-crm-Dialog-Footer" id="tdDialogFooter"> <table cellspacing="0" cellpadding="0"> <tr> <td> <button onclick="window.close();" class="ms-crm-Button">Закрыть</button> <button onclick="javascript: copyToClipboard();" class="ms-crm-Button" style="width:150px;">Скопировать в буфер</button> </td> <td width="100%"> </td> </tr> </table> </td> </tr> </table> </body> </html>
Это веб-интерфейс приложения, который использует файл FetchUtil.js.
Публикуем и открываем HTML Веб-ресурс fetchExample.htm.