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

Простой рабочий пример веб-службы REST с загрузкой Spring

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

Весенняя загрузка и Kubernetes (Серия из 4 частей)

В этом мы рассмотрим очень простой веб-сервис , который может отвечать на HTTP-запросы . Этот блог идеально подходит для людей, которые хотят начать использовать Spring Boot .

Так почему же вы, как разработчик Java, должны заботиться о весенней загрузке? Ну, есть много веских причин! 😊 Прежде всего, Spring является открытым исходным кодом , что означает, что он постоянно поддерживается и тестируется сообществом и является бесплатным или платным. Во-вторых, согласно Hotframeworks , это наиболее широко используемая веб-платформа Java 2019 года. В-третьих, есть отличный способ быстро запустить и запустить приложение Spring , в котором вступает в игру Spring Boot: Благодаря Spring Boot вам не нужно беспокоиться о большом количестве кода и конфигурации котельной плиты. Spring Boot автоматически устанавливает для вас множество настроек по умолчанию, но при необходимости вы всегда можете их перезаписать. Для этой цели Spring Boot является самоуверенным, то есть люди из команды Spring выбрали для вас некоторые конфигурации, но они хорошо приняты сообществом.

Кстати, почему мы вообще должны заботиться о веб-фреймворках? Ну, есть много элементов, которые используются снова и снова в типичных веб-службах, таких как ответ на HTTP-запрос, охват новых потоков для каждого входящего запроса, механизмы безопасности, такие как HTTPS и OAUTH2 и так далее. Мы не хотим изобретать велосипед каждый раз, когда создаем новый веб-сервис, и для этой цели мы можем использовать веб-фреймворки со всеми этими общими механизмами. Дополнительные функции веб-фреймворков включают доступ к базе данных, планирование задач, инверсию управления и т.д. Все эти приятные функции включены в Spring Boot, и, таким образом, у вас есть больше времени для других вещей, таких как употребление хорошего капучино ☕

В качестве заключительного вступительного замечания позвольте мне упомянуть, что Spring совместим не только с Java, но и с Kotlin , языком, очень популярным для приложений для Android .

Теперь мы создадим веб-сервис hello-world. Весь необходимый код приведен здесь, и окончательное решение также доступно в моем репозитории Github .

Реквизиты для выполнения всех шагов:

  • Знаток
  • Java JDK 8 или выше
  • Командная строка

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

Мы используем Maven как инструмент сборки, а Spring Boot предлагает отличный способ создать ваш POM-файл: Направляйтесь к https://start.spring.io/ и введите все данные нашего приложения, как показано ниже:

Вы можете использовать более новую версию Spring Boot и Java, конечно, если вы предпочитаете. В любом случае, не забудьте добавить “Spring Web” в качестве начальной зависимости – мы будем использовать ее для наших конечных точек REST. После того, как вы заполнили все данные, используйте кнопку “СОЗДАТЬ”. Это позволит загрузить ZIP-файл с начальной структурой проекта Java и, что наиболее важно, начальным pom.xml файл.

Давайте подробнее рассмотрим сгенерированный файл POM. В верхней части POM вы можете видеть, что мы наследуем от spring-boot-starter-parent , который содержит все необходимое для приложения Spring-Boot.

  
    org.springframework.boot
    spring-boot-starter-parent
    2.2.6.RELEASE
     
  

Далее в POM, в разделе зависимости , вы можете видеть, что мы будем использовать spring-boot-starter-web :

    
      org.springframework.boot
      spring-boot-starter-web
    

Вы можете найти хорошее описание этой зависимости на mvnrepository.com :

Стартер для создания веб-приложений, в том числе RESTful, с использованием Spring MVC. Использует Tomcat в качестве встроенного контейнера по умолчанию.

В любом случае, до сих пор мы рассмотрели только один важный файл: pom.xml файл. Далее давайте сосредоточимся на основном классе, который вы можете найти в разделе src/main/java/com/пример/springbootexample/springbootexampleapplication.ява :

@SpringBootApplication
public class SpringBootExampleApplication {

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

}

Что здесь интересно, так это просто аннотация вверху: @SpringBootApplication . Помимо прочего, эта аннотация гарантирует, что наше приложение Spring Boot будет настроено с использованием свойств Spring Boot по умолчанию (например, тайм-ауты для HTTP-запросов и многое, многое другое).

Поскольку позже мы хотим создать конечную точку REST, нам нужен наш основной класс для поиска сервлетов, и поэтому нам нужно добавить еще одну аннотацию к нашему основному классу: @servletcomponentscan (опять же, если сегодня у вас ленивый день и вы не хотите заниматься кодированием, вы можете посмотреть завершенный код в моем репозитории Github ).

Далее давайте создадим конечную точку REST. Для этой цели мы создаем новый класс Java и называем его PingRestController.java (вы можете использовать ту же папку, что и для основного класса).

Содержание PingRestController.java должно выглядеть так:

package com.example.springbootexample;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PingRestController {

  @RequestMapping(method = RequestMethod.GET, path = "/api/ping")
  public ResponseEntity getPing() {
    return ResponseEntity.ok("pong");
  }

}

Аннотация @RestController означает, что этот класс содержит конечные точки REST. Каждая конечная точка REST представляет собой метод с аннотацией @RequestMapping . В данном конкретном случае у нас есть только один такой метод: получение . Этот метод выполняется каждый раз, когда соответствующий вызов REST поступает на наш сервер. Давайте более подробно рассмотрим аннотацию @RequestMapping: Мы указываем метод и путь переменную. Эти две переменные указывают, что мы хотим записать HTTP-запрос GET в URI “/api/ping”. Также обратите внимание на тип возвращаемого значения нашего метода получения: ResponseEntity обертывает HTTP-ответ, и тело HTTP должно быть просто строкой. Таким образом, ответ на HTTP-вызов всегда будет выглядеть следующим образом:

Headers: Status: 200, ContentType: text/plain;charset=UTF-8
Body: "pong"

С измененным основным классом и классом RestController Ping у нас есть все части, готовые для запуска нашего сервиса. В терминале введите:

mvn clean install
java -jar target/spring-boot-example-0.0.1-SNAPSHOT.jar

Теперь в вашем любимом веб-браузере введите:

localhost:8080/api/ping

Вы должны увидеть ответ “понг”!

Что происходит в фоновом режиме, так это то, что ваш браузер отправляет запрос HTTP GET на локальный хост, который обрабатывается вашим приложением Spring Boot и отвечает строкой “pong”.

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

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

Мы реализуем наш интеграционный тест в src/test/java/com/example/springbootexample/PingIntegrationTest.java :

package com.example.springbootexample;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

@ExtendWith(SpringExtension.class)
@SpringBootTest
@AutoConfigureMockMvc
public class PingIntegrationTest {

  @Autowired
  private MockMvc mvc;

  @Test
  public void testHelloWorldEndpoint() throws Exception {
    String response = mvc
        .perform(get("/api/ping"))
        .andReturn().getResponse().getContentAsString();
    assertEquals("Hello world", response);
  }
}

Как вы можете видеть, тестирование конечной точки REST требует немного больше кода. А пока давайте просто сосредоточимся на интересных моментах, и я оставлю вам возможность понять каждую строку кода. Итак, вот важные моменты:

  • @SpringBootTest : Запустите веб-сервер локально и подготовьте его к ответу на тестовые вызовы REST
  • частный MockMvc mvc : Объект MockMvc позволяет нам запускать тестовые HTTP-вызовы на наш веб-сервер
  • @Тест : Как и в случае с Junit-тестами, каждый тест реализуется в методе, аннотированном @ @тест .
  • mvc.выполнить(получить("api/ping")) : Здесь мы запускаем HTTP-запрос GET

Вы можете запустить тест с помощью следующей команды:

mvn -Dtest=PingIntegrationTest test

Ааааанд… интеграционный тест завершается неудачно 🙈 Что случилось? Ну, не нужно беспокоиться, в приведенном выше тестовом примере есть всего лишь крошечная ошибка. Я оставлю это на ваше усмотрение, чтобы найти причину ошибки и исправить ее!

Spring Boot автоматически настраивает многие свойства вашего сервиса. Например, когда мы проверяли нашу собственную службу, нам приходилось использовать порт 8080. Теперь мы нигде этого не определяли… это просто весенняя загрузка по умолчанию. Все эти свойства по умолчанию можно найти в официальном документе здесь . Чтобы изменить это поведение по умолчанию, все, что нам нужно сделать, это создать файл application.properties и перезаписать соответствующее значение. Итак, продолжайте и измените src/основные/ресурсы/приложение.свойства :

server:
  port: 8082

Теперь, когда вы перекомпилируете и перезапустите службу, конечная точка REST будет доступна на порту 8082.

Мы рассмотрели весь код, необходимый для создания простого сервиса REST. Используя Spring Boot, нам просто понадобилось в общей сложности 23 строки кода Java для создания рабочей конечной точки REST! Более того, не требовалось никакой конфигурации XML. Довольно круто!

Я надеюсь, что этот пост помог вам начать работу с Spring Boot, пожалуйста, запомните его ❤️ и оставьте комментарий ниже! 😊

Весенняя загрузка и Kubernetes (Серия из 4 частей)

Оригинал: “https://dev.to/pmgysel/simple-working-example-of-rest-web-service-with-spring-boot-4plo”