Статьи

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

В этом руководстве представлено пошаговое руководство по созданию веб-службы REST с использованием  среды Spring .

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

  • Eclipse IDE (релиз Марса)
  • Java 1.8
  • Apache Tomcat 8

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

С помощью этого руководства создайте веб-проект Maven  и назовите свой проект  SpringRestService .

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

2. Добавить пружинные зависимости

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

<properties>
        <springframework.version>4.3.0.RELEASE</springframework.version>
        <jackson.library>2.7.5</jackson.library>
   <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.library}</version>
        </dependency>
  </dependencies>

В этом уроке мы используем Spring 4.3.0 и нам интересны следующие модули:

  • Spring -Core: это основной модуль Spring Framework; его следует использовать в любом приложении на базе Spring.
  • spring-web, spring-webmvc: это веб-модули, которые позволяют создавать ресурсы REST или стандартные контроллеры.
  • jackson-databind:  эта библиотека обеспечивает неявное преобразование между классами JSON и POJO. Когда эта библиотека импортируется в pom.xml, вам не нужно беспокоиться о преобразовании запросов JSON в POJO или ответов POJO в JSON; это полностью обрабатывается неявно этой библиотекой. Если вас интересует тип данных XML, используйте jackson-xml-databind .

Чтобы узнать больше о модулях Spring, проверьте это .

После добавления вышеуказанных зависимостей следующие jar-файлы автоматически импортируются в ваш проект в Maven Dependencies :

3. Внедрение ресурсов REST

Теперь, когда мы можем создать наше первое REST-приложение с использованием Spring.

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

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

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

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;
 }

}

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

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;
 }

}

Наиболее важным классом в нашем API является контроллер, который действует как интерфейс для связи клиент / сервер, каждый контроллер действует как ресурс, который предоставляет некоторые сервисы и доступ к которому осуществляется через определенный URL-адрес.

В нашем примере мы определяем один ресурс с именем PaymentController , который предоставляет клиентам сервис оплаты.

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

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.

4. Настройте REST API

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

Spring 4.3.0 поддерживает несколько аннотаций конфигурации, больше нет необходимости определять конфигурации в web.xml .

По сути, нам нужно создать два класса:

  • ApplicationInitializer: это класс инициализатора, который загружается при запуске приложения, он определяет класс конфигурации приложения вместе с URL-адресом контекста.
  • ApplicationConfiguration: это класс конфигурации приложения, он в основном используется для указания контейнера сервлета загружать ресурсы REST из определенного пакета.

Вот так:

package com.programmer.gate;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.programmer.gate")
public class ApplicationConfiguration {


}
package com.programmer.gate;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

 @Override
 protected Class < ? > [] getRootConfigClasses() {
  return new Class[] {
   ApplicationConfiguration.class
  };
 }

 @Override
 protected Class < ? > [] getServletConfigClasses() {
  return null;
 }

 @Override
 protected String[] getServletMappings() {
  return new String[] {
   "/rest/*"
  };
 }

}

В нашем примере мы указываем контейнеру сервлета загружать ресурсы из пакета com.programmer.gate, и мы выставляем наш API через / rest url.

5. Разверните REST API

Теперь, когда наш API готов к развертыванию, мы развернем его на Tomcat 1.8 / JRE8 (если вы не настроили Tomcat на Eclipse, следуйте этому руководству ). 

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

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

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

{
 "status": "success",
 "code": 100
}

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

{
 "status": "error",
 "code": 102
}

 

Это оно; Я надеюсь, что вы найдете это полезным.