21.09.2011, 20:11 | #1 |
Участник
|
axforum blogs: Использование OData в CRM2011
Источник: http://axforum.info/forums/blog.php?b=273
============== Многие из вас уже, наверно, успели поиграть с новым удобным End Point для работы с сервисом CRM. Соглашусь, примеры в блогах разработчиков и демонстрации в Hands On Labs впечатляют. Долой не читаемые портянки SOAP запросов и ура простой и четкой URL адресации. К сожалению, ситуация омрачается тем, что CRM SDK все сильнее деградирует от версии к версии, так что получать информацию из этого ресурса становится все сложнее. В итоге, многие детали реализации механизмов системы либо пишутся между строк, либо вообще остаются неосвещенными. В этом посте я изложу основные тезисы, которые мне удалось вычленить. Во-первых, использовать REST End Point, для манипуляции с данными, действительно удобно. Код получается более кратким и читаемым, хотя теперь, когда мы получили поддержку пользовательских JS библиотек, это уже не столь существенно. Дьявол и тут скрывается в деталях. Чтобы получить данные нужно построить запрос, но в SDK вы найдете больше ссылок на стандарт OData, нежели конкретных примеров синтаксиса. К счастью есть решение, которое позволяет строить запросы через удобный визуальный интерфейс: CRM 2011 OData Query Designer. Минуса у решения ровно два:
1. Не работают фильтры по первичному ключу записи: Код: //error /xrmservices/2011/OrganizationData.svc/AccountSet?$filter=AccountId eq guid'{guid}' Вместо этого необходимо использовать синтаксис: Код: xrmservices/2011/OrganizationData.svc/AccountSet(guid'{guid}') 2. Параметры REST запросов чувствительны к регистру! Более того, имена полей в запросе - это не их схема, как это принято при работе через SOAP или объектную модель! По неясным причинам, в метаданные атрибута объекта в CRM 2011 вводится свойство Schema Name, которое чувствительно к регистру и, как и схема, не меняется после создания. На форме атрибута этого поля нет, но зато оно отражается в представлении: Код: //ok ../AccountSet?$select=Name //error ../AccountSet?$select=name Кроме этого, существуют ограничения на длину URL запроса, количество возвращаемых записей, поддерживаемые функции OData. Какие? - читайте в SDK! Во-вторых, составить запрос - это еще пол беды. Нужно еще как-то его выполнить, а потом обработать результат. Вот тут-то нас подстригает второй неприятный момент. Готовых системных библиотек для этих целей не предусмотрено. Более того, все примеры в SDK написаны с применением свободных библиотек jQuery и JSON, которые придется подключать к формам, если вы хотите их использовать. И хотя поддержка JSON есть во всех современных браузерах включая IE версии 8 и выше, веб сервер CRM работает в режиме совместимости с IE 7, поэтому объекты JSON не будут созданы. Кроме этого, могут быть проблемы, если вы используете "чистый" jQuery.ajax. Для того, чтобы запрос вернулся в корректном формате рекомендуется установить дополнительные хидеры HTTP запроса при помощи свойства beforeSend: Код: $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", datatype: "json", /* ... */ beforeSend: function (XMLHttpRequest) { //Specifying this header ensures that the results will be returned as JSON. XMLHttpRequest.setRequestHeader("Accept", "application/json"); } }); Предупрежден - значит вооружен. Удачного скриптинга! Источник: http://axforum.info/forums/blog.php?b=273
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
|
|