Использование протокола Odata в построении веб-приложений на базе Rest архитектуры
Журнал: Научный журнал «Студенческий форум» выпуск №16(67)
Рубрика: Технические науки
Научный журнал «Студенческий форум» выпуск №16(67)
Использование протокола Odata в построении веб-приложений на базе Rest архитектуры
Целью данной работы является описание и использование современной технологии - Odata-протокол, в целях оптимизации работы программного обеспечения и увеличения качества разработки веб приложений.
Многие согласятся, что Rest Api (Representation state transfer. Application program interface – программный интерфейс приложения) подход построения веб-приложений в клиент-серверной архитектуре - это хороший способ передачи и обработки данных с сервера. Для реализации такого подхода, все что нужно это сформировать корректную Url (Uniform resource locator – унифицированный указатель ресурса) строку с правильными параметрами (Http-parameters), заголовками (Http-headers), отправить веб запрос (web-request) для получения данных веб ответом (web-response). Вроде бы все просто. Но недостатком подобной реализации, является то, что программные интерфейсы либо являются «жесткими» в плане реализации, что означает получение данных только в точном соответствии с определением логики на стороне сервера. Либо такие интерфейсы содержат слишком много кода, что означает ухудшение его читаемости, а также невозможность «гибкой» поддержки.
Эти недостатки позволяет исправить OData протокол. Open Data Protocol (OData) это веб протокол, который определяет операции с сущностями базы данных, используя http-команды, и идентифицирует эти сущности по стандартному синтаксису URI. Данные передаются поверх http с применением стандартов Json или XML.
В данной публикации рассказывается о возможности «гибкой» реализации Rest Api стандарта с использованием OData, а также приводятся примеры использования протокола в Asp.Net веб-проекте на языке C#.
Соглашения при построении OData Url-строк
Данные соглашения предоставляют набор команд, которые можно передать программному интерфейсу через строку Url отправленного http запроса. На рис. 1 представлен OData Url-адрес, который обычно состоит из трех частей:
- Корневой Url адрес (Service Root Url)
- Путь к ресурсу (Resource path)
- Параметры запроса (Query options)
Рисунок. 1 OData Url-адрес
Выглядит достаточно просто. Кроме понятного использования OData предоставляет мощный функционал по обработке данных. Вот список параметров запроса (query options), которые можно использовать:
$select – позволяет определить подмножество свойств для возврата запрашиваемой сущности.
$expand – позволяет включать данные, связанных сущностей запрашиваемой сущности.
$top – позволяет выбрать M результатов запроса.
$skip – позволяет пропустить M результатов запроса.
$count – позволяет получить определенное количество элементов запроса
$search – позволяет осуществить поиск в произвольном тексте в свойстве запрашиваемой сущности.
$format – позволяет определить формат для возвращаемых данных.
$filter – позволяет отфильтровать запрошенный набор данных.
Заметим, что множество команд схожи с большинством известных команд языков запросов.
Сравним реализации Rest Api подходов построения веб приложений, с использованием OData протокола и без него.
Представим, что в нашей базе данных есть следующие сущности:
Рисунок. 2 Сущности
Реализуем метод контроллера asp.net веб-приложения, на языке C#, который будет возвращать всю информацию о книгах и связанных с ними сущностях базы данных:
В коде выше представлен контроллер книг - BookController и метод Get(), который возвращает набор сущностей книг из базы данных. Для получения данных связанных таблиц используется метод расширения LINQ Include().
Теперь попробуем получить название первой книги, используя метод контроллера выше. Url строка запроса будет выглядеть следующим образом:
http://localhost:8600/api/books
Увидим следующий Sql запрос, который сгенерировала программа при вызове метода Get():
Как видим для получения названия одной лишь книги используется такой громоздкий запрос, который каждый раз необходимо фильтровать на стороне клиента, для получения названия книги. Чтобы добиться оптимального результата можно изменить логику метода Get() или же написать множество похожих методов обработки, но это не удобно, а в некоторых случаях, когда нам недоступен доступ к серверной части веб-приложения - невозможно. Теперь воспользуемся функционалом OData. Существует множество источников по настройке OData протокола в проект Asp.net, но это тема не данной публикации. Поэтому опустим детали и код настройки и сразу увидим код метода контроллера, сконфигурированного под работу с протоколом Odata:
Как видим из кода, во первых, теперь нам ненужно использовать методы расширения Include() для получения данных связанных сущностей, во вторых добавлен атрибут [EnableQuery], который позволяет обращаться к методу Get() через Odata Url:
http://localhost:8600/odata/Book?$top=1
Теперь взглянем на сгенерированный sql запрос:
Запрос выглядит более понятным. Возможно, кто-то из читателей задастся вопросом, что в выборке нет связанных данных. Это так, но их легко можно получить, не переделывая серверный метод контроллера. Все что нужно - лишь сформировать другую OData Url строку с нужным параметром запроса. Так, например, можно получить информацию о книгах и об авторе с именем «Ф.М. Достоевский»:
http://localhost:8600/odata/Автор?$expand=Книга&$filter=Имя eq ’Ф.М. Достоевский’
Наконец, получим название первой книги из базы данных с помощью следующей Odata Url строки:
http://localhost:8600/odata/Книга?$top=1&?select=Название
Таким образом, единожды описав метод серверной части веб приложения мы имеем возможность осуществлять выборку в базу данных с любым условием. Нельзя не оценить полезность использования протокола Odata. Его применение позволяет облегчить понимание использования вашего программного интерфейса с помощью простой, но одновременно мощной функциональности Odata Url строки, добиваясь при этом той необходимой гибкости использования и обработки данных с сервера и повышения качества разработки веб-приложения на базе Rest архитектуры.