Обработка 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. Из которого и выбираем нужные нам поля.