Разработка
19
Сен
0

Обработка REST-запросов с помощью JavaScript

CRM 2011 значительно упростил процесс выполнения несложных запросов в отношении сервера CRM с помощью REST-запросов. Как составлять сами команды мы рассматривать не будем (где-то я уже это делал 🙂 )… А рассмотрим обработку данных возвращаемых REST-запросами. Всего REST-запросы можно получать в двух форматах ATOM и JSON. Вот их и рассмотрим…

JSON #1.1

Цель: вернуть всех пользователей CRM.

Прежде чем перейти к коду, нам понадобится загрузить в CRM в качестве Веб-ресурса библиотеку json2.js (локальное зеркало). И Вам необходимо будет ее подключать на всех формах, где используется ниже следующий код (а так же код из примера JSON 1.2). Это библиотека понадобится нам для распарсивания JSON-кода (для следующего примера она также понадобится).

А вот и сам код:

if (typeof (MyFunctionsPack) == "undefined") { MyFunctionsPack = {}; }

MyFunctionsPack.MyFunctions = {
    GetUserInformation: function () {
        var serverURL = Xrm.Page.context.getServerUrl() + '/XRMServices/2011/OrganizationData.svc/SystemUserSet';

        var getSystemUsers = new XMLHttpRequest();
        getSystemUsers.open("GET", serverURL, true);
        getSystemUsers.setRequestHeader("Accept", "application/json");
        getSystemUsers.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        getSystemUsers.onreadystatechange = function () { MyFunctionsPack.MyFunctions.retrieveSystemUserCallBack(this); };
        getSystemUsers.send(null);
    },
    retrieveSystemUserCallBack: function (retrievedSystemUser) {
        if (retrievedSystemUser.readyState == 4 /* complete */) {
            if (retrievedSystemUser.status == 200) {
                var retrievedUsers = JSON.parse(retrievedSystemUser.responseText).d;
                for (var intCounter = 0; intCounter < retrievedUsers.results.length; intCounter++)
                    alert(" FullName = {" + retrievedUsers.results[intCounter].FullName + "}");
            }
            else
                alert("Не получилось :(");
        }
    }
};

Код состоит из двух функций:

  • GetUserInformation, здесь мы:
    • Формируем URL конечной точки REST и имя возвращаемого набора данных (SystemUserSet);
    • Создаем объект запроса XMLHttpReques (с именем getSystemUser), для которого далее устанавливаем:
      • Тип запроса GET;
      • Асинхронный способ обмена информацией (значение true в строчке getSystemUsers.open(«GET», serverURL, true); если задать false – запрос будет синхронным);
      • Формат обмена данными JSON;
      • При изменении состояния асинхронного запроса вызывать функцию retrieveSystemUserCallBack и передавать в качестве параметра текущий объект XMLHttpRequest.
    • Ну, и отправляем запрос.
  • retrieveSystemUserCallBack:
    • Сначала проверить готовность запроса (4 = завершен) и состояние запроса (200 = успешно возвращен);
    • Затем в следующем операторе JSON.parse десериализуем JSON в переменную JavaScript. JSON.parse определен в библиотеке Json2. Поскольку мы определили, что возвращаемый формат будет JSON, результаты будут в свойстве «d» возвращенного объекта данных. Когда возвращается список записей, то в свойстве «d» будут храниться массив отдельных записей. Соответственно, после JSON.parse, перебираем значения свойства «d» (через переменную retrievedUsers), чтобы получить доступ к отдельным записям и далее его полям (в данном случае – FullName).


JSON #1.2

Цель: вернуть одного пользователя из CRM.

Код:

if (typeof (MyFunctionsPack) == "undefined") { MyFunctionsPack = {}; }

MyFunctionsPack.MyFunctions = {
    GetUserInformation: function () {
        var serverURL = Xrm.Page.context.getServerUrl() + '/XRMServices/2011/OrganizationData.svc/SystemUserSet(guid\'3DCC5D39-F9D9-E011-AB01-000C29CDB72E\')';

        var getSystemUsers = new XMLHttpRequest();
        getSystemUsers.open("GET", serverURL, true);
        getSystemUsers.setRequestHeader("Accept", "application/json");
        getSystemUsers.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        getSystemUsers.onreadystatechange = function () { MyFunctionsPack.MyFunctions.retrieveSystemUserCallBack(this); };
        getSystemUsers.send(null);
    },
    retrieveSystemUserCallBack: function (retrievedSystemUser) {
        if (retrievedSystemUser.readyState == 4 /* complete */) {
            if (retrievedSystemUser.status == 200) {
                var retrievedUser = JSON.parse(retrievedSystemUser.responseText).d;
                alert(
                    " FullName = { " + retrievedUser.FullName + " }\n" +
                    " Telephone = { " + retrievedUser.Address1_Telephone1 + " }\n" +
                    " Email = { " + retrievedUser.PersonalEMailAddress + " }"                
                );
            }
            else
                alert("Не получилось :(");
        }
    }
};

Код аналогичен предыдущему, затем исключением, что когда Вы создаете запись или возвращаете единственную запись (используя уникальный идентификатор), свойство «d» будет представлять собой саму запись (т.е. ее данные). Через которое мы и получаем отдельные поля.


ATOM #2.1

Цель: вернуть всех пользователей CRM.

Код:

if (typeof (MyFunctionsPack) == "undefined") { MyFunctionsPack = {}; }

MyFunctionsPack.MyFunctions = {
    GetUserInformation: function () {

        var serverURL = Xrm.Page.context.getServerUrl() + '/XRMServices/2011/OrganizationData.svc/SystemUserSet(guid\'3DCC5D39-F9D9-E011-AB01-000C29CDB72E\')';

        var retrieveRequest = new XMLHttpRequest();
        retrieveRequest.open("GET", serverURL, false);
        retrieveRequest.send();

        var resultXml = retrieveRequest.responseXML;

        var doc = new ActiveXObject("MSXML2.DOMDocument");
        doc.async = false;
        doc.loadXML(retrieveRequest.responseText);

        var record = doc.selectSingleNode("//entry/content/m:properties");
        alert(
            " FullName = { " + record.selectSingleNode("d:FullName").text + " }\n" +
            " Telephone = { " + record.selectSingleNode("d:Address1_Telephone1").text + " }\n" +
            " Email = { " + record.selectSingleNode("d:PersonalEMailAddress").text + " }"
        );
    }
};

Этот код состоит из одной функции (GetUserInformation), в которой мы:

  • Формируем URL конечной точки REST и имя возвращаемого набора данных (SystemUserSet);
  • Создаем объект синхронного запроса XMLHttpReques (с типом запроса GET). По умолчанию формат обмена данными будет ATOM;
  • Далее отправляем запрос, а ответ помещаем в переменную resultXml в виде XML;
  • Ну а дальше все просто: проходимся по XML структуре, перебираем полученные записи и на каждой итерации выводим значение одного поля.


ATOM #2.2

Цель: вернуть одного пользователя из CRM.

Код:

if (typeof (MyFunctionsPack) == "undefined") { MyFunctionsPack = {}; }

MyFunctionsPack.MyFunctions = {
    GetUserInformation: function () {

        var serverURL = Xrm.Page.context.getServerUrl() + '/XRMServices/2011/OrganizationData.svc/SystemUserSet';

        var retrieveRequest = new XMLHttpRequest();
        retrieveRequest.open("GET", serverURL, false);
        retrieveRequest.send();

        var resultXml = retrieveRequest.responseXML;

        var doc = new ActiveXObject("MSXML2.DOMDocument");
        doc.async = false;
        doc.loadXML(retrieveRequest.responseText);

        var records = doc.selectNodes("//feed/entry");
        for (var i = 0; i < records.length; i++) {
            alert(" FullName: { " + records[i].selectSingleNode("content/m:properties/d:FullName").text + " }");
        }
    }
};

Ну, тут все то же самое, что и в предыдущем коде, только нет узла feed, а есть только один узел entry. Из которого и выбираем нужные нам поля.


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

*

code