Статьи

Создание веб-службы REST с использованием Spring Boot

Это руководство содержит пошаговое руководство по созданию полноценного веб-сервиса с использованием Spring Boot .

Предпосылки:

  • Eclipse IDE (неоновый выпуск)
  • Maven 4
  • Java 1.8

1. Создать веб-проект Maven

Откройте eclipse, затем создайте новый веб-проект maven и назовите его SpringBootRest.

Структура сгенерированного проекта выглядит следующим образом:

2. pom.xml

После создания веб-проекта первым шагом является настройка Spring Boot внутри pom.xml , поэтому мы добавляем следующее в качестве родительской зависимости:

1
2
3
4
5
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
</parent>

Spring Boot предоставляет стартовую зависимость, называемую spring-boot-starter-web, которая автоматически импортирует все необходимые jar-файлы, необходимые для разработки и предоставления контроллеров REST. Итак, мы добавляем это как зависимость:

1
2
3
4
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

В этом уроке мы используем встроенный tomcat, предоставленный Spring Boot, поэтому мы собираемся построить наше приложение как исполняемый файл jar, установив атрибут упаковки как jar:

1
<packaging>jar</packaging>

PS: если вы хотите использовать внешний tomcat, обратитесь к разделу «Развертывание приложения Spring Boot на внешнем tomcat» .

Последний шаг настройки — добавление плагина Spring Boot:

1
2
3
4
5
6
7
8
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
</build>

Буквально, это все, что нам нужно, чтобы начать разработку наших контроллеров REST.

Ниже приведены банки, автоматически импортированные Spring Boot:

Это целый pom.xml для справки:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.programmer.gate</groupId>
  <artifactId>SpringBootRest</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>SpringBootRest</name>
   
   <properties>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
     
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>
     
  <dependencies>
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  </dependencies>
   
  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3. Application.java

Второй шаг — создать класс инициализатора Spring Boot, это точка входа нашего приложения. Аннотирование класса с помощью @SpringBootApplication эквивалентно использованию @Configuration, @EnableAutoConfiguration и @ComponentScan с их атрибутами по умолчанию в традиционных приложениях Spring.

01
02
03
04
05
06
07
08
09
10
11
12
package com.programmer.gate;
  
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
  
@SpringBootApplication
public class Application{
  
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

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

4. Реализация ресурсов REST

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

Наш API будет принимать только запросы JSON и отвечать ответами JSON , благодаря библиотеке Джексона, которая позволяет нам обрабатывать запросы и ответы как классы POJO, не беспокоясь о преобразованиях JSON / POJO .

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.programmer.gate;
  
public class PaymentRequest {
  
    private int userId;
    private String itemId;
    private double discount;
  
    public String getItemId() {
        return itemId;
    }
  
    public void setItemId(String itemId) {
        this.itemId = itemId;
    }
  
    public double getDiscount() {
        return discount;
    }
  
    public void setDiscount(double discount) {
        this.discount = discount;
    }
  
    public int getUserId() {
        return userId;
    }
  
    public void setUserId(int userId) {
        this.userId = userId;
    }
  
}

И это базовый ответ, возвращаемый из нашего сервиса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.programmer.gate;
  
public class BaseResponse {
  
    private String status;
    private Integer code;
  
    public String getStatus() {
        return status;
    }
  
    public void setStatus(String status) {
        this.status = status;
    }
  
    public Integer getCode() {
        return code;
    }
  
    public void setCode(Integer code) {
        this.code = code;
    }
  
}

Теперь мы определяем наш контроллер с именем PaymentController в com.programmer.gate :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.programmer.gate;
  
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
  
@RestController
@RequestMapping("/payment")
public class PaymentController {
     
    private final String sharedKey = "SHARED_KEY";
     
    private static final String SUCCESS_STATUS = "success";
    private static final String ERROR_STATUS = "error";
    private static final int CODE_SUCCESS = 100;
    private static final int AUTH_FAILURE = 102;
  
    @RequestMapping(value = "/pay", method = RequestMethod.POST)
    public BaseResponse pay(@RequestParam(value = "key") String key, @RequestBody PaymentRequest request) {
         
        BaseResponse response = new BaseResponse();
        if(sharedKey.equalsIgnoreCase(key))
        {
            int userId = request.getUserId();
            String itemId = request.getItemId();
            double discount = request.getDiscount();
             
            // Process the request
            // ....
            // Return success response to the client.
             
            response.setStatus(SUCCESS_STATUS);
            response.setCode(CODE_SUCCESS);
        }
        else
        {
            response.setStatus(ERROR_STATUS);
            response.setCode(AUTH_FAILURE);
        }
        return response;
    }
}

Единственный сервис, предоставляемый нашим контроллером, — это метод pay (), который выглядит очень простым, он проверяет клиентский запрос с использованием предварительно определенного общего ключа, обрабатывает запрос и возвращает статус операции.

Ниже приведены общие аннотации, используемые нашим контроллером:

  • @RestController: эта аннотация помечает класс как ресурс, она неявно определяет аннотации @Controller и @ResponseBody mvc, при аннотировании класса с помощью @RestController не обязательно писать @ResponseBody рядом с классами POJO, возвращаемыми из ваших методов.
  • @RequestMapping: эта аннотация определяет URL ресурса в дополнение к типу метода: GET / POST , в нашем примере мы предоставляем платежный сервис как POST, доступ к которому осуществляется через / payment / pay.
  • @RequestParam: эта аннотация представляет конкретный параметр запроса, в нашем примере мы сопоставляем параметр запроса с именем key с ключом аргумента типа String.
  • @RequestBody: эта аннотация представляет тело запроса, в нашем примере мы сопоставляем тело запроса с классом POJO типа PaymentRequest (Джексон обрабатывает преобразование JSON / POJO)

Как уже было отмечено, ответ представлен в виде BaseResponse, и нет необходимости аннотировать его, Джексон неявно преобразует его в JSON.

5. Разверните приложение

Ниже приведены шаги для развертывания нашего приложения:

  • Щелкните правой кнопкой мыши pom.xml -> run-as -> Maven install
  • Maven создает файл JAR с именем SpringBootRest-0.0.1-SNAPSHOT.jar внутри целевой папки
  • Откройте cmd, затем запустите jar, используя: java -jar SpringBootRest-0.0.1-SNAPSHOT.jar

Итак, наше приложение запущено и готово обслуживать запросы через порт 8080 по умолчанию.

6. Протестируйте сервис

Чтобы протестировать наш API, мы используем клиентский плагин Advanced REST из chrome и инициируем 2 разных запроса:

Успешный запрос: в этом запросе мы передаем действительный общий ключ в качестве параметра запроса вместе с деталями элемента в теле запроса. Вот как это выглядит:

И это наш ответ:

1
2
3
4
{
      "status": "success",
      "code": 100
}

Запрос на сбой: этот запрос похож на приведенный выше, но с неверным общим ключом, вот что мы получаем из нашего API:

1
2
3
4
{
     "status": "error",
     "code": 102
}

Вот и все, надеюсь, вы найдете это полезным.

Опубликовано на Java Code Geeks с разрешения Хуссейна Терека, партнера нашей программы JCG . См. Оригинальную статью здесь: создание веб-службы REST с использованием Spring Boot

Мнения, высказанные участниками Java Code Geeks, являются их собственными.