Разработка
13
Янв
0

Веб-приложение для выполнения 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, '&lt;');
    xmlReturn = xmlReturn.replace(/>/g, '&gt;');

    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>&nbsp;
                            <button onclick="javascript: copyToClipboard();" class="ms-crm-Button" style="width:150px;">Скопировать в буфер</button>
                        </td>
                        <td width="100%">&nbsp;</td>
                    </tr>
                </table>
            </td> 
        </tr> 
    </table>
</body> 
</html>

Это веб-интерфейс приложения, который использует файл FetchUtil.js.

Публикуем и открываем HTML Веб-ресурс fetchExample.htm.



Комментарии (0)

*

code