OData (Open Data Protocol) — это утвержденный ISO/IEC стандарт OASIS, который определяет набор лучших практик для построения и использования REST API. Протокол позволяет создавать службы на основе REST, которые с помощью HTTP-запросов предоставляют веб-клиентам возможность публиковать и редактировать ресурсы, идентифицированные с использованием URL и определенные в модели данных.
Назначение протокола OData — выполнение запросов от внешних приложений к серверу баз данных Creatio.
Приложение Creatio поддерживает протоколы OData 4 и OData 3. По сравнению с OData 3, OData 4 предоставляет больше возможностей. Основное отличие протоколов — разный формат данных ответа на запрос, который возвращается сервером. Различия протоколов OData 3 и OData 4 описаны в официальной документации OData. При планировании интеграции с Creatio по протоколу OData необходимо использовать протокол версии 4.
Для выполнения внешних запросов к приложению Creatio необходимо выполнить аутентификацию. При интеграции по протоколу OData Creatio позволяет использовать Forms-аутентификации и OAuth-аутентификацию. Интеграция по протоколу OData не поддерживает аутентификацию по протоколу LDAP. Рекомендуемым способом аутентификации для интеграции с приложением по протоколу OData является Forms-аутентификация, которая реализована с помощью веб-сервиса AuthService.svc. Виды аутентификации, которые поддерживаются в Creatio, описаны в статье Аутентификация. Чтобы настроить авторизацию по протоколу OAuth, воспользуйтесь инструкцией, которая приведена в статье Настроить авторизацию интегрированных приложений по протоколу OAuth 2.0.
Протокол OData 4
Доступ к объектам Creatio по протоколу OData 4 предоставляет веб-сервис odata.
Протокол OData 3
Доступ к объектам Creatio по протоколу OData 3 предоставляет веб-сервис EntityDataService.svc.
Сервис EntityDataService.svc предоставляет возможность работы с объектами Creatio в WCF-клиенте.
Windows Communication Foundation (WCF) — программный фреймворк в составе .NET Framework, который используется для обмена данными между приложениями.
Организация работы WCF-клиента реализована путем получения метаданных сервиса и создания клиентских прокси-классов. Клиентское приложение использует эти классы-посредники для работы с сервисом EntityDataService.svc Creatio.
Чтобы реализовать клиентское приложение:
- Создайте .NET-проект, в котором реализована интеграция с Creatio.
- Сгенерируйте клиентские прокси-классы сервиса EntityDataService.svc.
- Создайте экземпляр контекста среды выполнения сервиса EntityDataService.svc.
- Реализуйте клиентскую бизнес-логику интеграции с использованием методов созданного экземпляра прокси-класса.
Способы генерации прокси-классов сервиса EntityDataService.svc:
- C использованием утилиты DataServiceModel Metadata Utility Tool (DataSvcutil.exe).
- Из проекта клиентского приложения Visual Studio.
Генерировать прокси-классы с использованием утилиты DataServiceModel Metadata Utility Tool
DataSvcUtil.exe — программа командной строки, которая предоставлена сервисами WCF Data Services. Утилита использует канал OData для формирования клиентских классов службы данных, которые необходимы для доступа к службе данных из клиентского приложения .NET Framework.
Источники метаданных, которые утилита использует для формирования классов данных:
- WSDL — документ метаданных службы. Описывает модель данных, которая предоставлена службой данных.
- CSDL — файл модели данных. Используется язык определения концептуальной схемы (CSDL), который описан в спецификации [MC–CSDL]: формат файла определения концептуальной схемы.
- EDMX — *.xml-файл. Создается с помощью программ для работы с моделью EDM, которые входят в комплект Entity Framework. Дополнительные сведения описаны в спецификации [MC–EDMX]: модели EDM для формата упаковки служб данных.
Обычно утилита DataSvcUtil.exe установлена в каталоге C:\Windows\Microsoft.NET\Framework\v4.0. Для 64-разрядных версий систем это каталог C:\Windows\Microsoft.NET\Framework64\v4.0.
Детальная информация по утилите DataSvcutil.exe приведена в официальной документации MSDN.
Генерировать прокси-классы из проекта клиентского приложения Visual Studio
Чтобы сгенерировать прокси-классы из проекта клиентского приложения Visual Studio:
- В контекстном меню проекта клиентского приложения Visual Studio, в котором планируется реализация интеграции с Creatio, выберите пункт Add Service Reference….
- В поле Address введите полный адрес сервиса EntityDataService.svc.
- Нажмите на кнопку Go и укажите имя и пароль пользователя Creatio. Если аутентификация прошла успешно, то в окне Services отобразятся поддерживаемые сервисом сущности.
- В поле Namespace укажите имя пространства имен, в котором расположены сгенерированные прокси-классы (например, CreatioServiceReference). Ссылку на это пространство имен в дальнейшем добавьте в блок using кода проекта.
- Для генерации прокси-классов нажмите кнопку ОК. При этом в проект добавляется новый файл кода Reference.cs, содержащий описание прокси-классов, которые доступны к использованию для обращения и взаимодействия с ресурсами сервиса данных как с объектами.
Visual Studio предоставляет возможность генерации прокси-классы сервиса из сохраненного на диске файла метаданных сервиса. Для этого на шаге 2 в поле Address введите полный путь к файлу метаданных с префиксом file://.
После генерации прокси-классов сервиса в проект добавляется ссылка на сборку Microsoft.Data.Services.Client.dll, которая реализует поддержку протокола OData 3. Если в клиентском приложении необходимо использовать протокол более ранней версии, то ссылку на соответствующую сборку добавьте вручную. Данная клиентская библиотека позволяет выполнять запросы к сервису данных EntityDataService.svc, используя стандартные шаблоны программирования .NET Framework, включая использование языка запросов LINQ.
Чтобы успешно компилировать проект:
-
В код проекта добавьте директивы using.
-
В код проекта добавьте объявление переменной адреса сервиса OData.
Особенности использования протокола OData
Особенности, которые необходимо учитывать при использовании протокола OData:
- Невозможно создать системных пользователей.
- Невозможно задать культуру возвращаемых данных. Культура определяется культурой пользователя от имени которого выполняется запрос.
- Тело ответа на запрос может содержать максимум 20 000 строк.
- Пакетный запрос может содержать максимум 100 подзапросов.
- Максимальный размер файла, который можно загрузить с помощью запроса, задается системной настройкой Максимальный размер загружаемого файла (Attachment max size, код MaxFileSize) (по умолчанию — 10 Мб).
Решение типичных ошибок при интеграции по протоколу OData
При выполнении запросов по протоколу OData могут возникать ошибки, которые представлены в таблице ниже.
Ошибка типа |
Возникает при использовании в запросе операторов, которые не поддерживаются в Creatio. Для исправления ошибки переформулируйте запрос с использованием поддерживаемых операторов. Перечень доступных операторов описан в параметре parameters в статье Веб-сервис odata (OData 4). |
Ошибка при выполнении запросов к отдельным полям объекта. | Возникает после внесения изменений в структуру объекта. Для исправления ошибки выполните компиляцию. После этого поля доступны к использованию. |
Коды ошибок, которые возвращает Creatio в ответ на запрос по протоколу OData 4, описаны в статье Веб-сервис odata (OData 4).
Creatio API документация, которая содержит примеры различных CRUD-операций к Creatio с использованием протоколов OData 3 и OData 4, доступна на сайте Postman.
Элементы с типом данных Stream:
- Изображения.
- Файлы.
- Двоичные данные.
Для работы с типом данных Stream используются стандартные методы:
- GET — получение данных.
- POST — добавление данных.
- PUT — изменение данных.
- DELETE — удаление данных.
Для отображения результата выполнения запросов к Creatio при работе с типом данных Stream необходимо очистить кэш браузера.
Получить данные
Реализация примера
-
Получите идентификатор фото контакта "New user".
Фото контакта содержится в колонке [Data] таблицы [SysImage] базы данных. Чтобы получить идентификатор фото контакта "New user", выполните следующий SQL-запрос.
-
Получите фото контакта "New user".
Чтобы получить фото контакта "New user", выполните следующий запрос.
Добавить данные
Реализация примера
-
Добавьте контакт "New user".
Все контакты содержатся в таблице [Contact] базы данных. Чтобы добавить контакт "New user", выполните следующий запрос.
Идентификатор контакта "New user" "4c63c8fa-467b-48a6-973f-b2069298404f".
-
Добавьте фото контакта "New user".
Фото контакта должно содержаться в колонке [Data] таблицы [SysImage] базы данных. Для созданного контакта запись в таблице отсутствует, поэтому ее необходимо добавить. Чтобы добавить запись в таблицу, выполните следующий запрос.
В таблицу [SysImage] базы данных была добавлена запись, но колонка [Data] содержит значение "0х".
Изображение необходимо передать в теле запроса, а название изображения должно совпадать из значением поля [Name]. Чтобы добавить фото контакта в колонку [Data], выполните следующий запрос.
-
Выполните привязку добавленного фото к контакту "New user".
Для выполнения привязки фото к контакту "New user" необходимо установить связь между полем [Data] таблицы [SysImage] и полем [PhotoId] таблицы [Contact]. Чтобы установить привязку, выполните следующий запрос.
Чтобы добавить фото существующему контакту выполните:
- POST-запрос на добавление экземпляра объекта коллекции [SysImage].
- PUT-запрос на изменение значения поля [Data] экземпляра объекта коллекции [SysImage].
- PATCH-запрос на выполнение привязку добавленного фото к контакту "New user".
Изменить данные
Реализация примера
-
Получите идентификатор фото контакта "New user".
Фото контакта содержится в колонке [Data] таблицы [SysImage] базы данных. Чтобы получить идентификатор фото контакта "New user", выполните следующий SQL-запрос.
-
Измените фото контакта "New user".
Чтобы изменить фото контакта "New user", выполните следующий запрос.
Удалить данные
Реализация примера
-
Получите идентификатор фото контакта "New user".
Фото контакта содержится в колонке [Data] таблицы [SysImage] базы данных. Чтобы получить идентификатор фото контакта "New user", выполните следующий SQL-запрос.
-
Удалить фото контакта "New user".
Чтобы удалить фото контакта "New user", выполните следующий запрос.
Пакетный запрос (batch-запрос) позволяет объединить множество HTTP-запросов в один, указав в теле каждый запрос как отдельный объект. Сервер баз данных Creatio возвращает один HTTP-ответ, внутри которого содержатся ответы на каждый переданный запрос. Использование пакетных запросов позволяет повысить производительность приложения.
Для пакетных запросов используются:
- HTTP-метод POST.
- Параметр $batch.
- Заголовок Content-Type.
Значения заголовка Content-Type:
- application/json — позволяет установить единый тип возвращаемого сервером контента для всех запросов пакетного запроса.
- multipart/mixed — позволяет в теле пакетного запроса установить свой заголовок Content-Type для каждого запроса.
Если один из запросов завершается с кодом ответа групп 4хх-5хх, то прерывается выполнение последующих запросов. Чтобы после неуспешного выполнения запроса продолжить выполнение следующих запросов, необходимо к основному HTTP-запросу добавить заголовок Prefer: continue-on-error.
Пакетный запрос (Content-Type: application/json)
Пакетный запрос (Content-Type: application/json и Prefer: continue-on-error)
Пакетный запрос (Content-Type: multipart/mixed)
Пакетный запрос (Content-Type: multipart/mixed и разными наборами запросов)
Для получения коллекции объектов сервиса используется универсальный класс DataServiceQuery, который представляет собой запрос к сервису, возвращающий коллекцию сущностей конкретного типа.
Чтобы выполнить запрос к сервису данных EntityDataService.svc, предварительно необходимо создать экземпляр объекта контекста среды приложения Creatio.
Далее в примерах будет использована forms-аутентификация.
Чтобы реализовать forms-аутентификацию:
- Создайте класс LoginClass.
- Реализуйте поля authServiceUri (строка запроса к методу Login аутентификационного сервиса AuthService.svc) и AuthCookie (Cookie аутентификации Creatio).
- Реализуйте метод TryLogin(string userName, string userPassword), который выполняет аутентификацию пользователя и сохраняет ответ сервера в поле AuthCookie.
-
Реализуйте метод OnSendingRequestCookie(object sender, SendingRequestEventArgs e), который будет вызван в ответ на событие экземпляра контекста SendingRequest (создание нового экземпляра HttpWebRequest).
В методе OnSendingRequestCookie выполняется аутентификация пользователя, а полученные в ответ cookies добавляются в запрос на получение данных.
Способы выполнения запроса к сервису:
- Выполнение LINQ-запроса к именованному объекту DataServiceQuery, который получен из контекста сервиса.
- Неявное перечисление объекта DataServiceQuery, который получен из контекста сервиса.
- Явный вызов метода Execute объекта DataServiceQuery или BeginExecute для асинхронного выполнения.
Получить коллекцию контактов через LINQ–запрос
Реализация примера
Получить коллекцию контактов неявным запросом
Реализация примера
Получить коллекцию контактов явным запросом
Реализация примера
Примеры CRUD-операций
В зависимости от используемого типа запроса протокол OData 4 возвращает различные данные.
Строка запроса
Методы запроса, которые поддерживает приложение Creatio:
- GET — получение данных.
- POST — добавление данных.
- PATCH — изменение данных.
- DELETE — удаление данных.
Адрес приложения Creatio.
Адрес веб-сервиса протокола OData 4. Неизменяемая часть запроса.
Имя таблицы базы данных (имя коллекции объектов). Чтобы получить перечень таблиц базы данных, выполните аутентификацию и один из запросов.
Идентификатор строки записи таблицы базы данных (идентификатор экземпляра объекта коллекции).
Поле записи таблицы базы данных (поле экземпляра объекта коллекции).
Необязательные параметры OData 4, которые разрешены к использованию в строке GET запроса к Creatio. Для указания параметров используйте оператор ?. Имя параметра записывается после оператора $. Чтобы использовать два и более параметров, воспользуйтесь оператором &.
$value | Значение поля. | |
$count | $count=true | Количество элементов, которые попали в выборку. |
$skip | $skip=n | n первых элементов, которые не должны попасть в выборку. |
$top | $top=n | n первых элементов, которые должны попасть в выборку. |
$select | $select=field1,field2,... | Набор полей, которые должны попасть в выборку. |
$orderby | $orderby=field asc или $orderby=field desc | Сортировка значений поля, которые попали в выборку. |
$expand | $expand=field1,field2,... | Расширение связанных полей. |
$filter | $filter=field template 'field_value' | Фильтрация полей, которые должны попасть в выборку. |
Заголовки запроса
Тип данных, в котором ожидается ответ от сервера. Не обязательный к использованию в GET запросах.
Кодировка и тип ресурса, который передается в теле запроса. Не обязательный к использованию в GET запросах.
Принудительное использование существующей сессии.
Аутентификационный cookie.
Тело запроса
Имена полей, которые передаются в теле запроса.
Значения полей field1, field2, ..., которые передаются в теле запроса.
Коды состояний ответа
Код состояния ответа на запрос.
200 OK |
Запрос, который не создает ресурс, успешно завершен и значение ресурса не равно нулю. Тело ответа содержит значение ресурса, указанного в URL-адресе запроса. Информация, которая возвращается с ответом, зависит от используемого метода запроса: GET — запрашиваемый ресурс найден и передан в теле ответа. POST — ресурс, который описывает результат действия сервера на запрос, передан в теле ответа. |
---|---|
201 Created | Запрос, который успешно создает ресурс. Тело ответа содержит созданный ресурс. Используется для POST запросов, которые создают коллекцию, создают объект мультимедиа (например, фотографию) или вызывают действие через его импорт. |
202 Accepted | Запрос на работу с данными принят в обработку, но еще не завершен. Нет гарантий, что запрос успешно выполнится в процессе обработки данных (асинхронная обработка запроса). |
204 No content | Запрос успешно обработан, но нет необходимости возвращать какие-либо данные. Запрашиваемый ресурс имеет нулевое значение. В ответе передаются только заголовки, тело ответа — пустое. |
3xx Redirection | Перенаправление указывает что для выполнения запроса клиенту необходимо предпринять дальнейшие действия. Ответ включает заголовок Location c URL-адресом, который позволяет получить результат. Также ответ может включать заголовок Retry-After, который отображает время (в секундах). Это период, в течение которого клиент может подождать прежде чем повторить запрос к ресурсу, который возвращен в заголовке Location. |
304 Not modified | Клиент выполняет GET запрос с заголовком If-None-Match и содержимое не изменилось. Ответ не содержит другие заголовки. |
403 Forbidden |
Cервер понял запрос, но отказывается его авторизировать. Это означает, что клиент не уполномочен совершать операции с запрошенным ресурсом. Причиной может быть некорректная кука BPMCSRF. Может возникать при отсутствии CSRF-токена. Для исправления ошибки добавьте передачу куки BPMCSRF. |
404 Not Found | Сервер не может найти ресурс, который указанй в URL-адресе. Дополнительная информация может содержаться в теле ответа. |
405 Method Not Allowed |
Ресурс, который указан в URL-адресе, не поддерживает указанный метод запроса. В ответе необходимо получить заголовок Allow, который содержит перечень доступных методов запроса для ресурса. Может возникать для PUT и DELETE запросов при включенном расширении WebDav HTTP. Для исправления ошибки отключите в IIS расширение WebDav HTTP. |
406 Not Acceptable | Ресурс, который указан в URL-адресе запроса, не имеет текущего представления, которое подходит для клиента в соответствии с Accept, Accept-Charset и Accept-Language заголовками запроса. Служба не желает предоставлять представление по умолчанию. |
410 Gone | Запрошенный ресурс больше недоступен. Ресурс раньше был по указанному URL, но теперь удален и недоступен. |
412 Prediction Failed | Клиент указал в заголовке запроса условие, которое ресурс не может выполнить. |
424 Failed Dependency | Текущий запрос к ресурсу невозможно выполнить, потому что запрошенное действие зависит от другого действия, выполнить которое не удалось. Запрос не выполнен через сбой зависимости. |
501 Not Implemented | Клиент использует метод запроса, который не реализован протоколом OData 4 и этот метод невозможно обработать. Тело ответа содержит описание нереализованного функционала. |
Тело ответа
Информация о типе возвращаемых данных. Кроме пути к источнику данных, элемент data_resource может содержать параметр $entity, который показывает что в ответе был возвращен единственный экземпляр объекта коллекции. Параметр присутствует только для GET и POST запросов.
Содержит коллекцию объектов. Отсутствует, если в ответе возвращен один экземпляр объекта коллекции. Параметр присутствует только для GET запроса.
Коллекция объектов. Параметр присутствует только для GET запроса.
Экземпляры объектов коллекции. Параметр присутствует только для GET и POST запросов.
Имена полей field1, field2, ... экземпляров объектов object1, object2, ... коллекции. Параметр присутствует только для GET и POST запросов.
Значения полей field1, field2, ... экземпляров объектов object1, object2, ... коллекции. Параметр присутствует только для GET и POST запросов.
В зависимости от используемого типа запроса протокол OData 3 может возвращать различные данные. Структура запроса и ответа рассмотрена ниже.
Строка запроса
Приложение Creatio поддерживает следующие методы запроса:
- GET — получение данных.
- POST — добавление данных.
- PATCH — изменение данных.
- DELETE — удаление данных.
Адрес приложения Creatio.
Путь к веб-сервису протокола OData 3. Неизменяемая часть запроса.
Адрес веб-сервиса протокола OData 3. Неизменяемая часть запроса.
Имя таблицы базы данных (имя коллекции объектов). При использовании протокола OData 3 к первому имени коллекции объектов в строке запроса необходимо добавлять слово Collection (например, ContactCollection). Получить перечень таблиц базы данных можно выполнив запрос к базе данных.
Идентификатор строки записи таблицы базы данных (идентификатор экземпляра объекта коллекции). Например, guid'00000000-0000-0000-0000-000000000000').
Поле записи таблицы базы данных (поле экземпляра объекта коллекции).
Необязательные параметры OData 3, которые разрешены к использованию в строке GET-запроса к Creatio. Для указания параметров необходимо использовать оператор ?. Имя параметра должно записываться после оператора $. Чтобы использовать два и более параметров, необходимо воспользоваться оператором &.
$value | Значение поля. | |
$count | $count=true | Количество элементов, которые попали в выборку. |
$skip | $skip=n | n первых элементов, которые не должны попасть в выборку. |
$top | $top=n | n первых элементов, которые должны попасть в выборку. |
$select | $select=field1,field2,... | Набор полей, которые должны попасть в выборку. |
$orderby | $orderby=field asc или $orderby=field desc | Сортировка значений поля, которые попали в выборку. |
$expand | $expand=field1,field2,... | Расширение связанных полей. |
$filter | $filter=field template 'field_value' | Фильтрация полей, которые должны попасть в выборку. |
Заголовки запроса
Тип данных, который можно ожидать в ответе от сервера. Сервер возвращает ответ в формате XML. Не обязательный к использованию в GET-запросах.
Кодировка и тип ресурса, который передается в теле запроса. Не обязательный к использованию в GET-запросах.
Заголовок ForceUseSession отвечает за принудительное использование уже существующей сессии. Отсутствует необходимость использования в запросе к сервису аутентификации AuthService.svc.
Аутентификационный cookie.
Тело запроса
Имена полей, которые передаются в теле запроса.
Значения полей field1, field2, ..., которые передаются в теле запроса.
Код состояния ответа
Код состояния ответа на запрос.
200 OK | Запрос GET, PUT, MERGE или PATCH успешно завершен. Тело ответа должно содержать значение объекта или свойства, указанного в URL-адресе запроса. |
---|---|
201 Created | Запрос POST успешно создал объект или ссылку. Тело ответа должно содержать обновленный объект. |
202 Accepted | Запрос на изменение данных был принят в обработку, но еще не завершен. Тело ответа должно содержать заголовок Location в дополнение в заголовке Retry-After. Тело ответа должно быть пустым. Сервер должен вернуть код ответа 303 с заголовком Location, который содержит окончательный URL-адрес для получения результата запроса. Тело и заголовки окончательного URL-адреса должны быть отформатированы также, как и выполнение первоначального запроса на изменение данных. |
204 No content | Запрос на изменение данных. Запрашиваемый ресурс имеет нулевое значение. Тело ответа должно быть пустым. |
3xx Redirection | Запрос на изменение данных. Перенаправление указывает что клиент должен предпринимать дальнейшие действия для выполнения запроса. Ответ должен включать заголовок Location c URL-адресом, по которому можно получить результат. |
4xx Client Error | Некорректные запросы. Сервер возвращает код в ответ на клиентские ошибки в дополнение к запросам на несуществующие ресурсы, такие как сущности, коллекции сущностей или свойства. Если тело ответа определено для кода ошибки, тело ошибки является таким, как определено для соответствующего формата. |
404 Not Found | Объект или коллекция, указанные в URL-адресе, не существуют. Тело ответа должно быть пустым. |