В этом руководстве представлено пошаговое руководство по созданию веб-службы 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
}
Это оно; Я надеюсь, что вы найдете это полезным.