Spring REST с примером

Сегодня поговорим о REST — стиле архитектуры программного обеспечения для распределенных систем. И, в частности, напишем простейший пример его использования с помощью фреймворка Spring MVC.

И так, что собой представляет REST и как он работает. Для начала нужно немного посмотреть скучные сведения из википедии. REST (сокр. от англ. Representational State Transfer — «передача состояния представления») — как правило, используется для построения веб-служб.

А теперь простым языком: с помощью REST мы имеем возможность передавать данные по сети в таком виде, в которым они находятся. Нам больше не нужно заворачивать их в XML, AMF — кто работал с сетью, тот поймет о чем я.

Spring имеет поддержку REST Api и нам уже не нужно беспокоиться о сложной реализации. Давайте посмотрим, как она реализована, написав простой «Hello world» пример.

Перед тем, как писать апи нужно сначала создать клиент, который будет посылать запросы. Это обычный AJAX запрос, который будет поступать на наш сервер. Все по порядку.

Создаем новый мавен проект, в который добавляем spring зависимости:

создание нового проекта спринг

Код    
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3.   <modelVersion>4.0.0</modelVersion>
  4.   <groupId>com.javamaster</groupId>
  5.   <artifactId>restspringapi</artifactId>
  6.   <packaging>war</packaging>
  7.   <version>0.0.1-SNAPSHOT</version>
  8.   <name>restspringapi Maven Webapp</name>
  9.   <url>http://maven.apache.org</url>
  10.   <properties>
  11.         <jackson.version>2.6.3</jackson.version>
  12.         <logback.version>1.1.3</logback.version>
  13.         <jcl.slf4j.version>1.7.12</jcl.slf4j.version>
  14.         <jstl.version>1.2</jstl.version>
  15.         <servletapi.version>3.1.0</servletapi.version>
  16.     </properties>
  17.   <dependencies>
  18.     <dependency>
  19.       <groupId>junit</groupId>
  20.       <artifactId>junit</artifactId>
  21.       <version>3.8.1</version>
  22.       <scope>test</scope>
  23.     </dependency>
  24.         <dependency>
  25.             <groupId>org.springframework</groupId>
  26.             <artifactId>spring-webmvc</artifactId>
  27.             <version>4.3.9.RELEASE</version>
  28.         </dependency>
  29.         <dependency>
  30.             <groupId>javax</groupId>
  31.             <artifactId>javaee-api</artifactId>
  32.             <version>7.0</version>
  33.             <scope>provided</scope>
  34.         </dependency>
  35.                 <!-- Need this for json to/from object important dependency-->
  36.         <dependency>
  37.             <groupId>com.fasterxml.jackson.core</groupId>
  38.             <artifactId>jackson-core</artifactId>
  39.             <version>${jackson.version}</version>
  40.         </dependency>
  41.  
  42.         <dependency>
  43.             <groupId>com.fasterxml.jackson.core</groupId>
  44.             <artifactId>jackson-databind</artifactId>
  45.             <version>${jackson.version}</version>
  46.         </dependency>
  47.  
  48.   </dependencies>
  49.   <build>
  50.     <finalName>restspringapi</finalName>
  51.   </build>
  52. </project>

 

Пока все идет по стандартной схеме: создали проект, добавили зависимости спринг и поддержку json. Теперь нужно создать простой контроллер и jsp файл, в котором разместим javascript код, для отправки запроса и выдачи ответа.

простой контролер

Не забудьте добавить классы настроек нашего проекта, который выделены красным. Более детально мы рассматривали эту тему в отдельной статье: «Настройка Spring без xml».

Файл index.jsp:

Код    
  1. <header>
  2.     src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  3.     <!-- JQuerry library -->
  4. </header>
  5. <h2>Hello World!</h2>
  6. <button onclick="myFunction()">Send request</button>
  7. <p id="paragraph"></p>
  8. <script type="text/javascript">
  9. function myFunction() {
  10.     //function which send ajax request to the server
  11.     $.ajax({
  12.         url : '/api/myrequest',
  13.         datatype : 'json',
  14.         type : "post",
  15.         contentType : "application/json",
  16.         data : JSON.stringify({
  17.             message : 'Hi there',
  18.             id : 1
  19.         }),
  20.         success : function(data) {
  21.             console.log(data);
  22.              $("#paragraph").text(data.message);
  23.         }
  24.     });
  25. }
  26. </body>
  27. </html>

 

Достаточно простой код. Для тех, кто не знаком с javascript и HTML объясняю: в теге header (тот, что сверху) мы добавили подключение библиотеки JQuerry — достаточно популярный фреймворк, который облегчает работу с javascript. Далее мы добавили параграф (тот что с тегом р) и кнопку Send request при нажатии на которую вызывается функция myFunction(). В данной функции мы посылаем запрос по /api/myrequest урлу с методом post, типом application/json и данными: message : ‘Hi there’, id : 1. В случае ответа мы выводим результат в консоль (ту консоль, что в браузере по кнопочке f12) и задаем нашему параграфу ответный текст.

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

Для начала, создадим простой POJO класс HelloWorldObject:

Код    
  1. package com.javamaster.domain;
  2.  
  3. /*
  4.  * Just simple pojo class
  5.  */
  6. public class HelloWorldObject {
  7.  
  8.     private String message;
  9.     private int id;
  10.     public HelloWorldObject() {
  11.         // TODO Auto-generated constructor stub
  12.     }
  13.     public String getMessage() {
  14.         return message;
  15.     }
  16.     public void setMessage(String message) {
  17.         this.message = message;
  18.     }
  19.     public int getId() {
  20.         return id;
  21.     }
  22.     public void setId(int id) {
  23.         this.id = id;
  24.     }
  25.     @Override
  26.     public String toString() {
  27.         return "HelloWorldObject [message=" + message + ", id=" + id + "]";
  28.     }
  29.    
  30. }

 

Это простой объект, который имеет два поля: id, message; геттеры и сеттеры; метод toString() для корректного вывода в консоль java.

Для обработки запроса нужно создать контроллер по примеру того, как мы создавали простой контроллер для получения jsp страниц по url, только с небольшими отличиями:

Код    
  1. package com.javamaster.controller;
  2.  
  3. import org.springframework.web.bind.annotation.PostMapping;
  4. import org.springframework.web.bind.annotation.RequestBody;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import org.springframework.http.HttpStatus;
  7. import org.springframework.http.ResponseEntity;
  8. import com.javamaster.domain.HelloWorldObject;
  9.  
  10. @RestController
  11. public class RestControllerClass {
  12.     @PostMapping("/api/myrequest")
  13.     public ResponseEntity<HelloWorldObject> catchPostMapping(@RequestBody HelloWorldObject object){
  14.         System.out.println(object);
  15.         HelloWorldObject responceObject = new HelloWorldObject();
  16.         responceObject.setId(2);
  17.         responceObject.setMessage("Hello world");
  18.         return new ResponseEntity<HelloWorldObject>(responceObject, HttpStatus.OK);
  19.     }
  20.    
  21. }

 

Вместо аннотации @Controller нужно добавить @RestController. В принципе, можно оставить аннотацию @Controller только тогда, Вам нужно будет над каждым рест методом проставить отдельные аннотации. Я же советую для обработки REST запросов создавать отдельные контроллеры, чтобы потом не запутаться.

Вместо страницы мы возвращаем объект ResponseEntity, который принимает очень разный набор параметров, самый распространенный из которых: объект и статус ответа.

Давайте запустим наш пример и посмотрим, что получилось: результат работы рест апи

В консоли Eclipse мы видим наше сообщение со страницы, а на странице наш ответ с сервера и все это без перезагрузки страницы.

Код на гитхаб: https://github.com/caligula95/restspringapi

Видео на ютуб:

Добавить комментарий