OData
OData — веб-протокол для работы с данными. Это "надстройка" над RESTful API, которая основывается на языке запросов внутри URL-адресов для идентификации и фильтрации данных. Благодаря зрелости и простоте использования OData стал естественным выбором для публикации внешнего API.
В основе OData лежит концепция модели данных сущностей (Entity Data Model, EDM). EDM описывает данные, которые предоставляются поставщиком OData через документ метаданных, содержащий ряд метаобъектов:
1️⃣ EntityType схож с обычным классом: имеет первичный ключ (Key, может быть только примитивным типом данных или перечислением EnumType), свойства (Properties) и ссылки на другие EntityType (Navigation)
2️⃣ Entity - экземпляр EntityType
3️⃣ ComplexType - это EntityType, но без ключа. Обычно используется в качестве свойств в EntityType или в качестве параметров операций
4️⃣ EntitySet - наборы сущностей заданного EntityType
5️⃣ Operations - операции над данными
а) Набор стандартных REST-операций над объектами (Entity) и связями (Navigation) между ними
б) Кастомные операции (функции и действия)
6️⃣ Singleton - объекты, которые имеют гарантированно только один экземпляр в приложении
Главный плюс OData - язык запросов, благодаря которому можно делать запросы к ресурсам прямо в URL. Этот язык очень схож с SQL благодаря опциям:
1️⃣ $filter фильтрует с помощью базовых предикатов (равно, больше, меньше и т.д.)
2️⃣ $orderby запрашивает ресурсы в порядке возрастания или убывания
3️⃣ $top запрашивает количество элементов, которые должны быть включены в результат. $skip запрашивает количество элементов, которые должны быть пропущены и не включены в результат. С помощью двух этих опций можно с легкостью делить списки сущностей на страницы.
4️⃣ $count запрашивает количество соответствующих ресурсов, включенных в ответ
5️⃣ $expand указывает связанные ресурсы, которые должны быть включены в результат. Схожа с оператором JOIN в SQL. В OData v4 может дополняться опцией $filter
6️⃣ $select запрашивает только тот набор свойств для каждой сущности, который перечислен в параметрах опции
7️⃣ $search ограничивает результат включением только тех объектов, которые соответствуют указанному поисковому выражению. Определение того, что означает сопоставление, зависит от реализации.
Остальные плюсы OData:
1️⃣ Поддерживает любой тип источника данных. В качестве источника данных можно использовать даже пользовательский класс.
2️⃣ Нет необходимости создавать объект прокси-службы, за счет чего достигается высокая производительность
3️⃣ Возможность создавать собственные методы
4️⃣ Полная поддержка CRUD (create, read, update, delete)
5️⃣ Широкий набор клиентов и серверов, поддерживающих технологию
Минусы OData:
1️⃣ OData передает данные в том числе в URL-адресах, для которых невозможно обеспечить полную безопасность. Обычно сервисы данных работают в доверенном режиме, поэтому метод сервиса вернет все связанные сущности, если пользователь их укажет. Это могут быть конфиденциальные данные, не разрешенные для просмотра.
2️⃣ В случае реализации с нуля необходимо описать бизнес-логику и хранение данных в соответствии со всеми описанными стандартами
3️⃣ Формат передачи данных неоптимален по размеру. С каждым значением атрибута сущности передается название этого атрибута, вместо того, чтобы передать название атрибутов в заголовке, а затем передавать только массив значений.
🛠 Самые популярные инструменты, в которых используется OData:
1. Продукты Microsoft (например, Azure)
2. Продукты SAP
3. Продукты 1С
4. Oracle Analytics Cloud
5. IBM WebSphere eXtreme Scale
6. Tableau
7. В любом популярном языке программирования есть библиотека для работы с OData
📖 Книги:
1. OData Programming Cookbook for .NET Developers
2. SAP Gateway and OData
📎 Статьи:
1. Официальный гайд для начинающих
2. OData vs. REST
3. Протокол OData – основное назначение
4. Обзор модели данных OData
5. Кратко об OData
6. Гайд по OData
7. WCF OData сервисы
8. OData, управляемая моделью
⏯️ Видео:
1. Гайд по OData для разработчиков от JetBrains
2. Пишем свой API: OData от Otus
3. Вебинары разработчиков 1С, Разработка http-сервисов и использование стандартного протокола Odata от ФТО
4. Генерация Swagger для OData от Microsoft
5. Сравнение OData и GraphQL