Разработка API

Программные решения для бизнеса

На этом уроке мы познакомимся с интерфейсом API, создадим свой собственный API, разберем предлагаемый функционал и протестируем некоторые имеющиеся возможности.
Глоссарий
Для успешного освоения материала рекомендуем вам изучить следующие понятия:
API
Application programming interface. Интерфейс, позволяющий двум независимым компонентам программного обеспечения обмениваться информацией
EF
Entity Framework. Объектно-ориентированная технология доступа к данным
HTTP
HyperText Transfer Protocol (протокол передачи гипертекста). Протокол прикладного уровня передачи данных изначально — в виде гипертекстовых документов в формате «HTML», в настоящий момент используется для передачи произвольных данных
JSON
JavaScript Object Notation. Текстовый формат обмена данными, основанный на JavaScript
XML
eXtensible Markup Language. Расширяемый язык разметки
База данных
DB (Database), БД. Организованная структура, предназначенная для хранения, изменения и обработки взаимосвязанной информации, преимущественно больших объемов
Запрос
Query. Средство выбора необходимой информации из базы данных
Метод
Method. Функция или процедура, принадлежащая какому-то классу или объекту, состоящая из некоторого количества операторов для выполнения какого-то действия и имеющая набор входных аргументов
Фреймворк
Framework. Программная платформа, определяющая структуру программной системы; программное обеспечение, облегчающее разработку и объединение разных компонентов большого программного проекта
Видеолекция
Конспект

Мы познакомимся с API и попытаемся понять, как же он связывает различные приложения. API — это интерфейс, позволяющий двум независимым компонентам программного обеспечения обмениваться информацией. API играет роль посредника между внутренними и внешними программными функциями, обеспечивая настолько эффективный обмен информацией, что конечный пользователь обычно его просто не замечают.

Например, посредством API может быть передана геолокация из мобильного приложения одного человека на сервер, а затем на мобильное устройство другого. В рамках разработки программного решения можно добиться наибольшей эффективности в том случае, если и настольное, и мобильное приложения будут работать с единой базой данных и получать актуальную информацию в режиме реального времени.

С этой целью мы и создадим свой API, который сам будет работать с базой данных и возвращать ответ в удобном для приложения виде
1. Создаем проект «Web API»
  • Даем название проекту
  • Выбираем тип Web API. Убираем галочку с конфигурации https
2. На данном этапе нам необходимо реализовать три метода в рамках API:
  • для получения списка отелей с изображениями
  • для получения списка комментариев по конкретному отелю
  • для добавления нового отзыва об отеле
3. В проект добавляем модель Entity Framework. Для работы с данными мы остановимся на формате json, хотя вам может встречаться и xml. За счет своей лаконичности json, по сравнению с xml, представляет собой одну из двух структур в закодированном виде. Это набор из двух пар: ключ — значение и упорядоченный набор значений. Это универсальные структуры данных. Как правило, любой современный язык программирования поддерживает их в той или иной форме
4. Для начала настраиваем возвращаемый формат json в файле WebAPIConfig
5. На каждую таблицу, с которой мы будем работать создаем отдельный контроллер. Он позволит не перемешивать объекты друг с другом, а писать код только для конкретной таблицы.


  • Создаем контроллеры для классов Hotel и HotelComment
  • Указываем название модели и контекст приложения
Например, в контроллере отзывов будут находиться все запросы, связанные с получением списка отзывов, с фильтрацией и поиском, добавлением, изменением, удалением и т. д. Для разграничения действий с ресурсами на уровне http методов были придуманы следующие варианты:

  1. get — получение ресурса
  2. post — создание ресурса
  3. put — обновление
  4. delete — удаление ресурса

Обратите внимание, спецификация http не обязывает сервер принимать все методы, которых, на самом деле, гораздо больше, чем четыре. Обязателен только get. А также не указывает серверу, что он должен делать при получении запроса с тем или иным методом
6. Создаем Response Model для отелей, чтобы возвращать еще и фотографию
  • Сначала перечисляем ряд свойств, которые относятся к этой модели, затем добавляем конструктор
  • Получаем первое изображение из таблицы HotelImage
  • В контроллере отелей первый метод возвращает все отели. Поработаем над методом GetHotels, а остальные оставляем по умолчанию. В нем мы преобразуем список полученных отелей к типу ResponseHotel. Также мы установим атрибут ResponseType — это тип ответа, который необходим для документации в разделе Информация об ответе
7. Запускаем и тестируем это в браузере
  • У нас есть раздел API, который описывает документацию наших запросов
  • Здесь у нас есть созданные контроллеры, в том числе Hotels. На методе Hotels типа get у нас есть Response Information, который мы, как раз, указали в качестве атрибута, и список его свойств
8. Попробуем вызвать запрос на получение списка отелей.
  • В необработанном виде они выглядят так
  • В формате json они имеют такую структуру
9. Переходим к комментариям. Создавать Response Model в этом случае мы не будем. Подойдет класс от Entity Framework. Добавляем новый метод с параметром и дадим ему название через атрибут Wrote. Если комментариев к отелю не будет, вернется пустой json
10. Запустим и проверим. При открытии документации в контроле HotelComments, у нас появится новый метод getHotelComments. Он описывает параметры, которые необходимо передать
11. Попробуем его вызвать: возьмем код отеля из базы — 101. Данные получены
12. Переходим к добавлению данных в контроллере. За это будет отвечать метод POST. Время добавления нового отзыва будем вычислять на стороне сервера, поэтому тот объект, который передают в качестве параметров, мы изменяем. Также мы делаем все проверки полученных данных с помощью свойства ModelState. Обращаем внимание на то, что пользователи могут вводить пустые данные при указании автора и текста. Также у нас есть ограничения в базе данных на размер символов для автора, при этом пользователи должны указывать реально существующее название отеля, в том числе его код
13. В случае, если сущность не пройдет валидацию, мы выдаем Bad Request с сообщениями об ошибках в этой модели. Иначе сохраняем переданную сущность и сохраняем изменения, вернув новый созданный экземпляр
14. Как правило, через браузер можно получить данные только по методу get. Однако, есть приложения или расширения, имитирующие и другие методы. Как, например, приложение Postman, позволяющее отправлять запросы различными методами и получать ответ. Также в качестве альтернативы можно использовать консоль Package Manager в Visual Studio.

  • Открываем приложение Postman
  • Добавляем в адресную строку путь
  • Выбираем метод POST
  • Сущность должна быть отправлена в формате json в теле запроса на вкладке Body
  • Указываем код отеля, автора и комментарий
  • Не забудьте указать в хэдере Content-Type — application/json. Именно этот тип данных мы передаем
15. Попробуем отправить запрос. Получаем ответ с созданной сущностью
16. Можно увидеть новую запись в таблице HotelComment
17. Кроме того проверяем на наличие ошибок данные, которые мы передали. Если мы указываем несуществующий код отеля, например, 2, тогда то, что мы обработали в API, будет выведено в качестве результата значения ModelState
Мы научились создавать API, обращаться к его методам, и получать ответ. Теперь с этими данными можно работать не только на компьютере, но и на мобильных устройствах, о чем и поговорим на следующем занятии.
Предлагаем вам проверить полученные знания, выполнив небольшие задания.
Интерактивное задание
Тест
Для закрепления полученных знаний пройдите тест
Стартуем!
Какой метод обязателен в стандарте HTTP:
Дальше
Проверить
Узнать результат
К сожалению, вы ответили неправильно
Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Неплохо!
Но можно лучше. Прочитайте лекцию и посмотрите видео еще раз
Пройти еще раз
Отлично!
Вы отлично справились. Теперь можете ознакомиться с другими компетенциями
Пройти еще раз