Рубрики
Без рубрики

От “А” до “Веб-приложения”: Создайте API на Java

Я пишу этот учебник, чтобы заполнить пустоту, которую я заметил. Создание веб-приложений – это вершина… С пометкой java, веб-разработчик, новички, учебник.

От “А” до “Веб-приложения” (Серия из 2 частей)

Я пишу этот учебник, чтобы заполнить пустоту, которую я заметил. Создание веб-приложений является главным приоритетом для людей, изучающих бэкэнд-разработку, но я не видел никаких руководств по Java или Spring Boot, которые предоставляли бы четкий путь, позволяющий быстро добраться туда с наименьшими трудностями. Учебные пособия либо слишком тривиальны ( Hello World API ), чтобы помочь вам понять, что вам нужно знать; либо они ошеломляют новичков и слишком много предполагают о том, что вы уже знаете!

Единственное, что вам уже следует знать, – это Java, до среднего уровня, все остальное я расскажу по пути. Если вы уже знакомы с какой-либо темой, вы можете пропустить ее вперед. Таким образом, вы знаете, что в ваших знаниях нет пробелов или слепых пятен на вашем пути обучения.

Я создам простой веб-API с помощью Spring Boot, что является большим шагом на пути к тому, что вы создали бы для приложения корпоративного уровня.

  • Что такое API?
  • Пример API Twitter
  • Что такое Весна и Весенний ботинок?
  • Что мы будем строить
  • Это самый последний способ?
  • Есть ли что-нибудь, что я должен знать, прежде чем начать?
    • Немного о шаблонах проектирования
      • Контроллер представления модели (MVC)
      • Другие шаблоны, используемые в более сложных примерах
    • Основы HTTP
      • Единый локатор ресурсов (URL)
      • HTTP-запрос
      • HTTP-ответ
      • Дальнейшее чтение по HTTP
    • Немного о JSON
      • Дальнейшее чтение по JSON
    • Немного об ОТДЫХЕ
  • Что вам нужно для завершения этого урока
  • Как настроить свой проект
  • Напишите код
    • Получить Всех Пользователей
    • Получить пользователя по идентификатору
    • Получить пользователя по имени
    • Добавить нового пользователя
    • Обновить пользователя
    • Удалить пользователя
  • Как протестировать ваше приложение
  • Исходный код
  • следующие шаги

Что такое API?

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

Давайте рассмотрим пример API, чтобы уточнить, что это такое на самом деле!

Пример API Twitter

Я предполагаю, что вы уже знаете, что такое Твиттер, но давайте уточним, что это такое, несмотря ни на что, Твиттер – это сайт социальных микроблогов. Со временем это стало чем-то большим, теперь это то место, где Дональд Трамп выходит из себя! Писать бесконечно

Ссылка на API Twitter дает вам длинный категоризированный список методов. Вы можете выполнять широкий спектр действий с твитами, прямыми сообщениями, настройками вашей личной учетной записи и многим другим. Почти все, что вы можете сделать на веб-сайте, можно сделать через API. Если бы вы захотели, вы могли бы использовать API для создания совершенно другого интерфейса для Twitter или бота Twitter.

Давайте рассмотрим пример использования API, скажем, мы хотим получить все твиты с временной шкалы @spiderman .

Просматривая список методов, ПОЛУЧИТЬ статусы/user_timeline представляется методом, который соответствует тому, что мы хотим. Это описание метода:

Нам нужно иметь клиентское приложение для выполнения методов. Мне нравится использовать Insomnia , но другие популярные приложения: CURL (инструмент командной строки), Почтальон (платформа для совместной работы для разработки API) и Почтальон (минимальная альтернатива Почтальону с открытым исходным кодом).

Если вы совершенно не знакомы с HTTP, вы можете перейти к разделу Основы HTTP , чтобы ввести себя в курс дела. Глядя на описание метода, нам нужно указать 1 параметр в нашем HTTP-запросе, чтобы получить нужные нам данные, этот параметр имя_экрана .

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

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

Вы можете видеть, что наш параметр имя_экрана добавляется к URL-адресу в нашем запросе. Мы используем знак вопроса, чтобы отметить начало наших параметров, затем мы указываем имя и значение параметра. Вы можете предоставить список параметров, если вам нужно, вы разделяете каждый параметр амперсандом.

Ответ возвращает массив твитов в формате JSON. Содержание твита содержится в поле текст . Как вы можете видеть, последний твит от Человека-паука: ” Узнайте, как рисовать Майлза Моралеса, он же Человек-паук, на этом специальном уроке испаноязычного языка с художником @MikeHawthorne… https:\/\/t.co\/RdvzWVzJ4o . “. Цвета паутины

Что такое Весна и Весенний ботинок?

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

Философия весны такова:

  • Хороший дизайн важнее, чем лежащая в его основе технология.
  • Классы, слабо связанные через интерфейсы, являются хорошей моделью.
  • Код должен быть легко тестируемым.

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

Spring Boot упрощает создание автономных приложений на базе Spring. Он предварительно сконфигурирован с учетом “мнения команды Spring” о наилучшей конфигурации платформы Spring и сторонних библиотек, так что вы можете начать работу с минимальной суетой. В нем есть встроенный веб-сервер, поэтому нет необходимости вручную развертывать приложение, вы можете просто запустить его.

Что мы будем строить

Мы создадим веб-сервис для Пользователя . Мы хотим, чтобы кто-то пользовался нашим приложением, не так ли? 😅 🙏

Мы не будем использовать базу данных, как это было бы в реальном приложении. У нас будут некоторые фиктивные данные, чтобы имитировать это.

В таблице ниже представлена краткая информация о нашем пользовательском API.

Получить всех пользователей /пользователи получить
Получать пользователей по идентификатору /пользователи/{идентификатор} получить
Получить пользователя по имени получить
Добавить нового пользователя /пользователи пост
Обновить пользователя /пользователи класть
Удалить пользователя /пользователи/{идентификатор} удалить

Когда мы запускаем наше приложение. Локальный адрес по умолчанию для вашего приложения Spring Boot должен быть: http://localhost:8080 , так что адрес для получения всех пользователей будет http://localhost:8080/users например.

Это самый последний способ?

Spring развивается версия за версией, поэтому стоит отметить, что вы можете увидеть некоторые различия между примерами, и это может немного сбить с толку. Большинство вариантов являются стилистическими, а некоторые основаны на изменениях структуры с течением времени. Текущая стабильная версия Spring – 5.25 и 2.3.0 для Spring Boot.

Я бы всегда советовал посмотреть самый последний учебник, который вы можете найти, и выбрать стиль учебника, соответствующий вашим предпочтениям в обучении.

Есть ли что-нибудь, что я должен знать, прежде чем начать?

Распространенная проблема, когда вы начинаете изучать, как создавать API с помощью Spring Boot, заключается в том, что учебные пособия ожидают, что вы будете знать что-то о шаблонах проектирования , которые неявно используются Spring; или они рассматривают это как механический процесс, которому нужно следовать: поместите это здесь, напишите метод, подобный этому, добавьте эту аннотацию и так далее. Это не лучший способ учиться. Я помогу вам понять, почему вы поступаете определенным образом.

Немного о шаблонах проектирования

Шаблон проектирования – это общее, многократно используемое решение часто встречающейся проблемы .

Шаблоны проектирования могут ускорить процесс разработки, предоставляя проверенные, проверенные решения. Повторное использование шаблонов проектирования помогает предотвратить небольшие ошибки, которые впоследствии могут привести к серьезным проблемам.

Более крупные приложения разделены на уровни с определенными обязанностями, что облегчает их обслуживание. Spring использует шаблон проектирования Model-View-Controller (MVC) для создания веб-приложений.

Контроллер представления модели (MVC)

Основная идея MVC заключается в том, что каждый слой вашего кода имеет определенную цель.

Какова цель каждого слоя:

  • Модель : Модель отражает реальные вещи, с которыми связано ваше приложение. Это модели реального мира. Классы в модели используются для хранения и управления состоянием вашего приложения.
  • Посмотреть : Представление – это пользовательский интерфейс. Он отображает модель пользователю. В веб-приложении это веб-страницы, которые мы пишем в HTML. Он охватывает “интерфейс” вашего приложения. Мы не пишем об этом в нашем примере приложения.
  • Контроллер : Уровень контроллера является связующим звеном между Моделью и слоями представления, он получает вводимые пользователем данные и решает, что с ними делать. Контроллер в веб-приложении состоит из двух частей. Первая часть – это веб-сервер, который сопоставляет входящие HTTP-запросы определенному методу обработчика, это встроенная часть Spring Boot. Вторая часть – это сами методы-обработчики, которые также можно путано назвать “контроллерами”, это тот бит, который мы пишем. Методы обработчика отвечают за возврат данных из модели.

Преимущество такого подхода заключается в том, что наше приложение более слабо связано . Вы можете изменить вид, но модель может остаться прежней. Такое разделение ответственности – это то, что делает наше приложение более удобным в обслуживании.

Если вы хотите получить более подробное объяснение, вы можете прочитать эту статью MVC .

Другие шаблоны, используемые в более сложных примерах

В нашем примере мы используем шаблон MVC только неявно.

В более продвинутых примерах вы также можете столкнуться или вам потребуется использовать следующие шаблоны проектирования:

Основы HTTP

Протокол передачи гипертекста ( HTTP ) является основой передачи данных во Всемирной паутине. Это протокол, который управляет передачей данных между клиентским приложением (например, веб-браузером) и веб-сервером. Клиенты и серверы общаются, обмениваясь отдельными сообщениями. Сообщения, отправляемые клиентом, называются запросами , а сообщения, отправляемые сервером в ответ, называются ответами .

Цель HTTP-запроса называется ресурсом . Как правило, веб-ресурс представляет собой файл на веб-сервере, такой как документ или фотография; но он эволюционировал, чтобы охватить любую “вещь”, которая является однозначно идентифицируемой. Теперь он может охватывать абстрактные ресурсы, такие как классы и свойства. Каждый ресурс идентифицируется Единым идентификатором ресурса (URI).

Единый локатор ресурсов (URL)

Наиболее распространенной формой URI является Единый локатор ресурсов ( URL ), который известен как веб-адрес . Это то, что вы вводите в свой веб-браузер для загрузки страницы.

URL-адрес состоит из разных частей, некоторые из которых являются обязательными, а другие необязательными.

  1. Схема или протокол : указывает, какой протокол необходимо использовать. Обычно это HTTP или его защищенная версия, HTTPS. Это обязательно .
  2. Полномочие или доменное имя : Указывает имя запрашиваемого веб-сервера. В качестве альтернативы можно напрямую использовать IP-адрес, но поскольку он менее удобен, он не часто используется в Интернете. Это обязательно .
  3. Порт : Порт – это логический идентификатор для определения местоположения определенного процесса или службы на веб-сервере. Обычно он опускается, если веб-сервер использует стандартные порты протокола HTTP (80 для HTTP и 443 для HTTPS) для предоставления доступа к своим ресурсам. Это необязательно .
  4. Путь : Это путь к ресурсу на веб-сервере. Путь может представлять физическое расположение файла на веб-сервере или может быть абстракцией, обрабатываемой веб-серверами для поиска ресурса.
  5. Запрос : Это список параметров. Параметры представляют собой список пар ключ-значение, разделенных амперсандом ( & ). Веб-сервер может использовать параметры для выполнения некоторой условной логики. Это необязательно .
  6. Фрагмент : Это привязка к части самого ресурса. Якорь похож на “закладку” внутри ресурса, указывающую браузеру, как показывать контент, расположенный в этом месте. Например, в HTML-документе браузер будет прокручиваться до точки, в которой определена привязка; для видео браузер попытается перейти ко времени, обозначенному привязкой. Это необязательно .

HTTP-запрос

HTTP-запрос состоит из следующего:

  • строка запроса. Например, ПОЛУЧИТЬ http://localhost:8080/users/1 HTTP/1.1 , который хочет получить ресурс , идентифицированный по пути /пользователи/1 с сервера,
  • поля заголовка запроса,
  • пустая строка,
  • и необязательный текст сообщения.
GET http://localhost:8080/users/1 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

HTTP определяет набор методов запроса , которые определяют действие, которое должно быть выполнено на данном ресурсе. Их иногда относят к глаголам HTTP. В веб-приложениях используются следующие методы HTTP-запроса:

  • ПОЛУЧИТЬ : Извлекать данные ресурса.
  • СООБЩЕНИЕ : Создайте новый ресурс.
  • ПОСТАВИТЬ : Обновить или заменить ресурс.
  • ИСПРАВЛЕНИЕ : Обновление или изменение ресурса.
  • УДАЛИТЬ : Удалить ресурс.

Вы часто будете видеть основные функции веб-приложения, называемые CRUD, что означает: Создавать, читать, обновлять, удалять.

HTTP-ответ

HTTP-ответ состоит из следующего:

  • строка состояния, содержащая код состояния и сообщение о причине,
  • поля заголовка ответа,
  • пустая строка,
  • необязательный текст сообщения.
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: application/json
Date: Mon, 01 Jun 2020 15:16:54 GMT
Keep-Alive: timeout=60
Transfer-Encoding: chunkedtes
Connection: close

{"id":1,"name":"Rob OLeary","age":21}

Ниже приводится краткое изложение типичного содержания в ответе на методы .

Создавать пост Код статуса: 201 (Создан) в случае успеха, 404 (Не найден) или 409 (Конфликт), если ресурс уже существует. Код статуса: 201 (Создан) в случае успеха, 404 (Не найден) или 409 (Конфликт), если ресурс уже существует. ‘ Заголовок местоположения со ссылкой на /пользователи/{идентификатор}, где {идентификатор} – это новый идентификатор.
Прочитай получить Коды состояния: 200 (ОК) в случае успеха, 404 (Не найден), если идентификатор не найден или недействителен. Верните данные клиента в теле, если они будут успешными. Код состояния: 200 (ОК). Список пользователей, содержащихся в теле. Разбивка на страницы, сортировка и фильтрация используются для обеспечения навигации по большим спискам.
Обновить/Заменить класть Коды состояния: 200 (ОК) или 204 (Нет содержимого) в случае успеха. 404 (Не найден), если идентификатор не найден или недействителен. Код состояния: 405 (Метод запрещен), если только вы не хотите обновить / заменить каждый ресурс во всей коллекции.
Обновлять/изменять заплатка Коды состояния: 200 (ОК) или 204 (Нет содержимого) в случае успеха. 404 (Не найден), если идентификатор не найден или недействителен. Код статуса: 405 (Метод запрещен), если только вы не хотите изменить саму коллекцию.
Удалить удалить Коды состояния: 200 (ОК) в случае успеха, 404 (Не найден), если идентификатор не найден или недействителен. Код статуса: 405 (Метод запрещен), если только вы не хотите удалить всю коллекцию целиком, что редко бывает желательно.

Дальнейшее чтение по HTTP

Для получения более полного руководства по HTTP вы можете прочитать HTTP-ссылку Mozilla

Немного о JSON

JSON расшифровывается как объектная нотация JavaScript и представляет собой синтаксис для хранения и обмена данными. JSON стал излюбленным форматом данных для веб-сервисов, а XML в настоящее время используется все реже.

Одна из причин популярности JSON заключается в том, что мы можем конвертировать любой JSON, полученный с сервера, в объекты JavaScript без какого-либо сложного синтаксического анализа и переводов, а поскольку JavaScript является языком веб-браузера, это упрощает создание веб-приложений.

Правила синтаксиса просты:

  • Данные представлены в парах имя-значение,
  • Строки содержатся в кавычках,
  • Данные разделяются запятыми,
  • Фигурные скобки удерживают объекты,
  • Квадратные скобки содержат массивы.

Например, объект пользователя будет записан как:

{ "name": "John", "age": 31 }

Массив пользователей будет записан как:

[
  { "name": "John", "age": 31 },
  { "name": "Mary", "age": 30 }
]

Дальнейшее чтение по JSON

Этого должно быть достаточно, чтобы вы знали при работе с веб-сервисами, но для получения дополнительной информации В W3schools есть серия коротких учебных пособий по JSON .

Немного об ОТДЫХЕ

Возможно, вы заметили, что в этой статье я почти не говорю об ОТДЫХЕ, и это потому, что я думаю, что этим термином слишком часто злоупотребляют.

Передача репрезентативного состояния (REST) – это архитектурный стиль, определяющий набор ограничений, которым можно следовать при создании веб-сервисов, в котором рекомендуется использовать многие соглашения Интернета. Он был предложен Роем Филдингом в его докторской диссертации в 2000 году.

Я рекомендую прочитать эту ветку StackOverflow на тему “Что такое программирование Restful” , чтобы узнать об этом больше, и вы сможете увидеть некоторое разнообразие мнений о том, что такое REST API “в дикой природе”.

Если вы создаете веб-сервисы с помощью фреймворка, такого как Spring Boot, вы по умолчанию следуете некоторым соглашениям о разработке API restful, но некоторые считают, что это веб-служба на основе HTTP, а не веб-служба restful. Это быстро становится неясным, когда люди говорят о том, насколько спокойным является веб-приложение, сравнивая его с академическим определением, я не думаю, что это продуктивная попытка сделать это.

Одним из ограничений REST является использование Гипермедиа в качестве механизма состояния приложения (HATEOAS) , что можно сделать при загрузке Spring, если вы используете зависимость Spring Data Rest starter. На практике большинство API-интерфейсов не соответствуют этому ограничению, и это заставляет некоторых людей говорить: “Ну, тогда это не API rest”. 😅 Есть смысл следовать ограничению, но для использования клиентами требуется больше работы, и я думаю, именно поэтому люди, как правило, не используют его так часто.

Для меня главное – быть прагматичным при создании веб-сервисов, делать их интуитивно понятными в использовании и простыми в расширении. То, с чем большинство людей склонны соглашаться и следовать, – это разместить приложение в ресурсах , мы делаем это в нашей модели и используем методы HTTP для реализации функциональности ресурса. Соглашение заключается в использовании единого пути для ресурса, такого как /пользователи , который является множественной версией названия ресурса. Это исключительный пост о прагматичном дизайне API restful , если вы хотите хорошо понять соглашения.

Что вам нужно для завершения этого урока

  • Около 1 часа.
  • Ваш любимый текстовый редактор или IDE.
  • JDK 1.8 или более поздней версии.
  • Gradle или Maven. Вы можете пропустить это в зависимости от вашей ИДЕИ, например, в IntelliJ встроен maven. Я использую maven.

Как настроить свой проект

Вы можете использовать Spring Initializr для создания своего проекта. Он предлагает быстрый способ создания каркасного проекта.

Для этого проекта требуется только одна зависимость, и это Spring Web .

Чтобы использовать Spring Initializr , заполните поля и нажмите кнопку Создать. Затем вы можете загрузить свой проект в zip-файле.

Распакуйте файл и откройте его в выбранной вами среде разработки.

Зависимости могут быть автоматически загружены вами при импорте/открытии проекта, или вам может потребоваться запустить загрузку самостоятельно:

  • В IntelliJ вы можете перейти в меню Файл > Синхронизация , чтобы запустить загрузку.
  • В командной строке:
    • Для maven выполните команду mvn install .
    • Для gradle выполните команду сборка gradle .

Spring Initializr создает класс по умолчанию для запуска вашего веб-приложения под названием UserApplication.java . Вы можете запустить это, чтобы убедиться, что вы настроены правильно. Он будет запускать веб-сервер для вас, не более того, потому что мы еще не написали никакого кода! Вы должны увидеть что-то подобное в командной строке, если она настроена правильно:

Вы можете следовать за мной и писать код вместе со мной, или вы можете скачать полный код с github .

Напишите код

Получить Всех Пользователей

Давайте начнем с написания кода, чтобы привлечь всех наших пользователей.

Создайте класс модели

Наше приложение – это все о пользователе, каким должно быть каждое приложение! 😉

Мы хотим создать класс Пользователя с атрибутами: идентификатор , имя и возраст .

За кулисами Spring может потребоваться создавать пустые объекты при создании или обновлении пользователей (отвечая на запросы POST и PUT). Таким образом, вам всегда нужно включать конструктор без аргументов, если вы хотите поддерживать эти действия.

Мы добавляем типичные методы для создания обычного класса java. Установщик и получатели необходимы для извлечения и изменения атрибутов. Мы должны включить равно и Хэш-код методы для поддержки сравнения Пользовательских объектов. Я использовал IntelliJ для создания всех этих методов.

public class User {
    private long id;
    private String name;
    private int age;

    //you must include a no-args constructor when you have a POST or PUT method
    public User(){ }

    public User(long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    //getters and setters, equals() and hashCode() generated by IDE
}

Создайте контроллер

Помните, что контроллер отвечает за сопоставление HTTP-запроса с методом java, который возвращает ответ.

Мы добавляем аннотации к нашему контроллеру для реализации функциональности. @RestController помечает класс как контроллер Rest, поэтому Spring может связать некоторые функции. Мы указываем, что Контроллер должен интерпретировать все запросы на путь /пользователи с помощью @RequestMapping ("/пользователи") .

Мы добавляем методы для обработки различных запросов и аннотируем их, чтобы указать метод HTTP, на который они отвечают. Мы возвращаем данные из метода, и Spring собирается преобразовать данные в JSON для нас и вернуть их в ответе.

Я создал Список массивов пользователей, чтобы вернуть некоторые данные.

Метод getUsers (вы можете называть его как хотите) возвращает всех пользователей для URL-адреса http://localhost:8080/users . Мы связываем URL-адрес с нашим методом, используя аннотацию @RequestMapping или @GetMapping . Мы возвращаем ArrayList из нашего метода.

import com.roboleary.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;

@RestController
@RequestMapping ("/users")
public class UserController {
    List users = new ArrayList();

    public UserController(){
        users.add(new User(1, "Rob OLeary", 21));
        users.add(new User(2, "Angela Merkel", 20));
        users.add(new User(3, "Tamer Osman", 20));
    }

    //for GET to http://localhost:8080/users
    @GetMapping
    public List getUsers(){
        return users;
    }
  }
Варианты сопоставления @запросов

Весна 4.3 представила аннотации ярлыков, которые служат той же цели, что и @RequestMapping но имейте метод HTTP как часть его имени.

Возможно, вы также видели, как они использовались. Они являются:

  • @Получить сопоставление
  • @Почтовое сопоставление
  • @Нанесение на карту
  • @Удалить отображение
  • @@Отображение пути

Итак, для аннотирования вашего метода вы можете использовать это:

@GetMapping

или это:

@RequestMapping(method=GET)

Создайте класс для запуска приложения

Если вы использовали Spring Initializr, то этот класс уже создан для вас!

Это основной класс, который инициирует упаковку вашего веб-приложения, а затем запускает встроенный веб-сервер для запуска нашего веб-сервиса для нас.

package com.spiderman.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }

}

Это самое трудное дело сделано!

Запустите приложение

Работает ли это? Запустите Пользовательское приложение класс, вы можете протестировать Метод GET в вашем веб-браузере.

Получить пользователя по идентификатору

Чтобы получить пользователя по идентификатору, мы хотим иметь возможность указать идентификатор в URL-адресе.

Например, мы переходим к http://localhost:8080/users/2 чтобы получить пользователя с идентификатором 2, и мы ожидаем получить этот ответ:

[{ id: 2, name: "Angela Merkel", age: 20 }];

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

Если пользователь найден, мы возвращаем статус OK (200). Если пользователь не найден, мы возвращаем статус Не найден (404).

@GetMapping(value="/{id}")
public ResponseEntity getUsersById(@PathVariable("id") long id){
    User userFound = null;

    for(User user: users){
        if(user.getId() == id){
            userFound = user;
            break;
        }
    }

    if (userFound == null) {
        return new ResponseEntity(HttpStatus.NOT_FOUND);
    }

    //found
    return new ResponseEntity(userFound, HttpStatus.OK);
}

Получить пользователя по имени

Чтобы получить пользователя по имени, мы хотим иметь возможность указать параметр в конце URL-адреса.

Например, мы переходим к http://localhost:8080/users?name=rob о’Лири чтобы получить пользователя с именем “роб Олеари”.

Браузер может добавить “+” для пробела в адресе следующим образом: http://localhost:8080/user?name=rob +олеарий , пробелы в URL-адресах считаются небезопасными . Вам не нужно ничего делать по-другому, это сработает в любом случае! Мы ожидаем получить этот ответ:

[{ id: 1, name: "Rob OLeary", age: 21 }];

Нам нужно добавить параметры в нашу аннотацию @GetMapping , чтобы указать имя параметра. Нам это нужно для определения уникального пути, чтобы Spring мог с уверенностью сопоставить запрос с правильным методом.

Мы указываем @RequestParam в подписи вашего метода, поэтому мы можем использовать эту переменную внутри нашего метода для поиска пользователя с таким именем. Мы используем equalsIgnoreCase () принимать любую комбинацию больших и маленьких букв, которую мы получаем от клиента.

Мы возвращаем статус в зависимости от того, был ли пользователь найден или нет.

@GetMapping(params = "name")
public ResponseEntity getUsersByName(@RequestParam(value="name") String name){
    List filteredUsers = new ArrayList();

    for(User user: users){
        if(user.getName().equalsIgnoreCase(name)) {
            filteredUsers.add(user);
        }
    }

    if (filteredUsers.isEmpty() == true) {
        return new ResponseEntity(HttpStatus.NOT_FOUND);
    }

    //found
    return new ResponseEntity(filteredUsers, HttpStatus.OK);
}

Добавить нового пользователя

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

На этот раз наш параметр помечен @RequestBody , это связано с тем, что данные предоставляются в теле HTTP-запроса.

Мы возвращаем код статуса статуса Http. СОЗДАН , который является HTTP-кодом 201. Невозможно добавить нового пользователя в наш Список массивов , но вам следует учитывать это, если вы используете базу данных.

@PostMapping
public ResponseEntity add(@RequestBody User u) {
       users.add(u);
       return new ResponseEntity(u, HttpStatus.CREATED);
}

Обновить пользователя

Обновляет пользователя или добавляет нового пользователя, если пользователь не найден.

Метод PUT является идемпотентным, что означает, что если вы выполните операцию несколько раз, результат будет одним и тем же.

Наш параметр снова помечен @RequestBody .

Мы возвращаем разные коды статуса в зависимости от того, обновили мы или добавили пользователя.

@PutMapping
public ResponseEntity addOrUpdate(@RequestBody User u) {
    ResponseEntity response;

    if(users.contains(u)){
        //update by setting it at the specified position
        int index = users.indexOf(u);
        users.set(index, u);
        response = new ResponseEntity(u, HttpStatus.OK);
    }
    else{
        users.add(u);
        response = new ResponseEntity(u, HttpStatus.CREATED);
    }

    return response;
}

Мы не используем ПАТЧ в нашем веб-приложении. ПАТЧ используется для частичного обновления.

Это может быть использовано при использовании базы данных, поскольку более эффективно обновлять только то, что изменилось, а не заменять весь объект. Поскольку мы делаем все в памяти с помощью ArrayList , в этом нет никакой пользы.

Удалить пользователя

Мы удаляем пользователя из нашего Списка массивов и возвращаем код статуса, чтобы указать, был ли пользователь найден или нет.

@DeleteMapping(value="/{id}")
public ResponseEntity delete(@PathVariable("id") long id) {
    boolean found = false;

    for(User user: users){
        if(user.getId() == id){
            users.remove(user);
            found = true;
            break;
        }
    }

    if (found == false) {
        return new ResponseEntity(HttpStatus.NOT_FOUND);
    }

    //found
    return new ResponseEntity(HttpStatus.OK);
}

Как протестировать ваше приложение

Если вы хотите создавать автоматизированные тесты для своего кода, это отдельная тема, которая заслуживает большего времени.

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

Вот краткий пример добавления нового пользователя с помощью Insomnia. Мы делаем запрос POST, как показано ниже, помещаем объект JSON нашего нового пользователя в тело запроса и устанавливаем тип тела в JSON (обычно для заголовка Content-Type устанавливается значение “приложение/json”). Код состояния 201 указывает на то, что пользователь был успешно создан.

Исходный код

Вы можете загрузить полный код с github.

robole/spring-boot-api-для-начинающих

Узнайте, как создать веб-API с помощью Spring Boot

Следующие шаги

  1. Научитесь писать (интеграционные) тесты для вашего веб-приложения.
  2. Добавьте базу данных для долгосрочного хранения ваших данных.
  3. Создайте полный API того, что вас интересует.
  4. Узнайте, как добавить аутентификацию для контроля доступа к данным.
  5. Узнайте, как документировать свой API. Вы можете использовать библиотеки, такие как AsciiDoctor и Swagger, для автоматизации некоторых из них.

Если вы нашли эту статью полезной, поставьте ❤ . Дайте мне знать, если вас заинтересует последующая статья по одной из вышеперечисленных тем! 🙂

Счастливого кодирования! 👩 Личный праздник

Значки для диаграмм взяты из проекта Существительное: Мобильный телефон от Rainbow Designs, Облако от Джеймса Копины, База данных от Kimmi Studios, Пользователь от Адриана Коке, Твиттер от Acid Beast.

От “А” до “Веб-приложения” (Серия из 2 частей)

Оригинал: “https://dev.to/robole/from-a-to-web-app-build-an-api-in-java-4he5”