Топ-100Первое Spring REST API-приложение - CodOrbits
LogoCodOrbits

Раздел: Spring REST

Узнайте, как создавать RESTful веб-сервисы с помощью Spring — легко масштабируемые и удобные для API-интеграции.

Все разделы
Иконка Spring REST

Первое Spring REST API-приложение

Last updated: 11 мая 2025 г.

Создадим свое собственное Rest Api. То есть мы создадим набор методов, к которым можно будет обращаться http запросом по ссылке. Эти методы будут возвращать java объекты конвертированные в JSON тому кто сделал запрос.

Создадим Мавен приложение с такой структурой и файлами:

В файле MainController будут находиться обработчики, которые будут принимать http запрос, конвертировать java объекты в JSON и отправлять этот JSON обратно тому кто сделал запрос.

В classes находятся классы, объекты которых будут конвертироваться в JSON.

Теперь давайте добавим необходимые зависимости в pom файл чтобы приложение работало. А именно Jackson для конвертации из JSON в объект и наоборот.

1<project xmlns="http://maven.apache.org/POM/4.0.0"
2         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
4         http://maven.apache.org/xsd/maven-4.0.0.xsd">
5    <modelVersion>4.0.0</modelVersion>
6    <groupId>com.MavenWebApp</groupId>
7    <artifactId>RestWEBapp</artifactId>
8    <packaging>jar</packaging>
9    <version>0.0.1-SNAPSHOT</version>
10    <name>hibernateCRUDapp Maven Webapp</name>
11    <url>http://maven.apache.org</url>
12
13    <dependencies>
14
15        <dependency>
16            <groupId>org.springframework</groupId>
17            <artifactId>spring-webmvc</artifactId>
18            <version>5.3.0</version>
19        </dependency>
20
21        <dependency>
22            <groupId>org.springframework</groupId>
23            <artifactId>spring-tx</artifactId>
24            <version>5.3.0</version>
25        </dependency>
26
27        <dependency>
28            <groupId>org.springframework</groupId>
29            <artifactId>spring-orm</artifactId>
30            <version>5.3.0</version>
31        </dependency>
32
33        <dependency>
34            <groupId>org.hibernate</groupId>
35            <artifactId>hibernate-core</artifactId>
36            <version>5.3.26.Final</version>
37        </dependency>
38
39        <dependency>
40            <groupId>mysql</groupId>
41            <artifactId>
42                mysql-connector-java
43            </artifactId>
44            <version>8.0.32</version>
45        </dependency>
46
47        <dependency>
48            <groupId>com.mchange</groupId>
49            <artifactId>c3p0</artifactId>
50            <version>0.9.5.5</version>
51        </dependency>
52
53        <dependency>
54            <groupId>javax.servlet</groupId>
55            <artifactId>
56                javax.servlet-api
57            </artifactId>
58            <version>3.1.0</version>
59        </dependency>
60
61        <dependency>
62            <groupId>javax.servlet</groupId>
63            <artifactId>jstl</artifactId>
64            <version>1.2</version>
65        </dependency>
66
67        <dependency>
68            <groupId>junit</groupId>
69            <artifactId>junit</artifactId>
70            <version>3.8.1</version>
71            <scope>test</scope>
72        </dependency>
73
74        <!-- добавим Jackson для конвертации 
75             из json в Java объект -->
76        <dependency>
77            <groupId>
78                com.fasterxml.jackson.core
79            </groupId>
80            <artifactId>jackson-databind</artifactId>
81            <version>2.15.2</version>
82        </dependency>
83
84    </dependencies>
85
86    <build>
87        <plugins>
88            <plugin>
89                <groupId>
90                    org.apache.maven.plugins
91                </groupId>
92                <artifactId>maven-war-plugin</artifactId>
93                <version>3.4.0</version>
94                <configuration>
95                    <failOnMissingWebXml>
96                        false
97                    </failOnMissingWebXml>
98                </configuration>
99            </plugin>
100        </plugins>
101    </build>
102</project>

Обработчики в нашем приложении будут конвертировать объект в JSON подобный тому, что приведен ниже.

1{
2  "musician_name": "Behoven",
3  "isclassic": true,
4  "numofoperas": 150,
5  "gratest_works": ["Archduke Trio",
6    "Missa Solemnis", "Symphony No. 5"],
7  "theMostFamousWork": {
8    "work_name": "Symphony No. 3 ‘Eroica",
9    "dedicatedTo": "to Napoleon",
10    "ComposedIn": 1802
11  },
12  "somePropToIgnore": "ignoreMe"
13}

Этот JSON хранит данные о музыканте Bethoven.

Здесь можно увидеть все типы информации, которые можно хранить в JSON.

В первых трех записях можно увидеть, что можно хранить разные типы данных, в нашем случае – string, boolean и int.

В четвертой записи можно увидеть, что в JSON также можно хранить массивы. Его элементы перечисляются в квадратных скобочках.

В пятой записи можно увидеть, что в JSON также можно хранить вложенный JSON. В нем хранятся данные, которые описывают самую известную работу автора Bethoven.

Зачем шестая запись дальше будет объеснено.

Давайте создадим класс музыканта объект которого будет конвертироваться в JSON подобный тому, что приведен выше и наоборот должна быть возможность конвертации JSON выше в объект класса ниже. Как можно увидеть он содержит такие же типы информации как и json, который был выше – три поля, массив и вложенный объект. Как уже говорилось для успешной конвертации имена сеттеров и геттеров в этом классе должны содержать имена записей из JSON.

1package com.MavenWebAps.RestWebApp.convertFromJsonjson;
2
3import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
5
6//Аннотация @JsonIgnoreProperties нужна просто
7//чтобы приложение не выдало ошибку если в классе
8//нет каких-то полей, которые есть в JSON, который
9//конвертируется в объект на основе этого класса.
10//В нашем случае это "somePropToIgnore": "ignoreMe".
11//Как можно увидеть в классе ниже нет поля
12//соответствующего записи
13//"somePropToIgnore": "ignoreMe" в JSON.
14@JsonIgnoreProperties(ignoreUnknown=true)
15public class Musician {
16
17	private String musician_name;
18	private boolean isclassic;
19	private int numofoperas;
20	private String[] gratest_works;
21	//В JSON файле приведенном ранее можно
22	//увидеть вложенный JSON: "theMostFamousWork":
23	//{"work_name": "Symphony No. 3 ‘Eroica'", …}
24	//Этот вложенный JSON сконвертируется как
25	//внутренний объект объекта класса Musician.
26	//Класс этого внутреннего объекта нам тоже нужно
27	//создать. Поэтому ниже в следующем примере 
28        //кода после текущего создается
29	//класс TheMostFamousWork.
30	private TheMostFamousWork theMostFamousWork;
31
32	public Musician() {
33	}
34
35	public Musician(String musician_name,
36					boolean isclassic, int numofoperas) {
37		this.musician_name = musician_name;
38		this.isclassic = isclassic;
39		this.numofoperas = numofoperas;
40	}
41
42	//Заметьте что названия геттерам и сеттерам даны
43	//в соответствии с именами данных в JSON, то есть
44	//левой части записей. Например сеттер и геттер
45	//ниже для записи "musician_name" : "Behoven"
46	//содержит имя левой части этой записи.
47	//Имена очень важно давать именно такие
48	//чтобы конвертация происходила успешно.
49	public String getMusician_name() {
50		return musician_name;
51	}
52
53	public void setMusician_name(
54				String musician_name) {
55		this.musician_name = musician_name;
56	}
57
58	public boolean isIsclassic() {
59		return isclassic;
60	}
61
62	public void setIsclassic(boolean isclassic) {
63		this.isclassic = isclassic;
64	}
65
66	public int getNumofoperas() {
67		return numofoperas;
68	}
69
70	public void setNumofoperas(int numofoperas) {
71		this.numofoperas = numofoperas;
72	}
73
74	public String[] getGratest_works() {
75		return gratest_works;
76	}
77
78	public void setGratest_works(
79			String[] gratest_works) {
80		this.gratest_works = gratest_works;
81	}
82
83	public TheMostFamousWork getTheMostFamousWork() {
84		return theMostFamousWork;
85	}
86
87	public void setTheMostFamousWork(
88			TheMostFamousWork theMostFamousWork) {
89		this.theMostFamousWork = theMostFamousWork;
90	}
91
92}

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

1*TheMostFamousWork.java
2package com.MavenWebApps.RestWEBApp.convertfromjsoncl;
3
4public class TheMostFamousWork {
5	private String work_name;
6	private String dedicatedTo;
7	private int ComposedIn;
8
9	public TheMostFamousWork() {
10	}
11
12	public String getWork_name() {
13		return work_name;
14	}
15
16	public void setWork_name(String work_name) {
17		this.work_name = work_name;
18	}
19
20	public String getDedicatedTo() {
21		return dedicatedTo;
22	}
23
24	public void setDedicatedTo(String dedicatedTo) {
25		this.dedicatedTo = dedicatedTo;
26	}
27
28	public int getComposedIn() {
29		return ComposedIn;
30	}
31
32	public void setComposedIn(int composedIn) {
33		ComposedIn = composedIn;
34	}
35}

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

1package com.MavenWebAps.RestWEBApp.controller;
2import java.util.ArrayList;
3
4//Напишем свое REST Api!
5//В Spring MVC для обработки http методов и автоматической
6//конвертации из JSON в java объекты используеться
7//@RestController вместо @Controller, который был раньше.
8@RestController
9public class MainController {
10	//Этим обработчиком просто отправляем в ответ
11	//тому кто сделал запрос по адресу /getMusician
12	//объект класса Musician в JSON формате.
13	//Конвертация Java объектов в JSON и наоборот
14	//происходит "за кулисами" средствами Jackson,
15	//ничего специального для конвертации делать
16	//не нужно. Просто возвращаем объект из метода
17	//и он автоматически отправляеться тому кто
18	//вызвал метод по ссылке /getMusician
19	//в JSON формате.
20	@RequestMapping("/getMusician")
21	public Musician getMusician() {
22		return new Musician("Bethoven",true,150);
23	}
24
25	//Помним что результат запроса SELECT для извлечения
26	//нескольких записей из таблицы, который совершаеться
27	//средствами hibernate, записываеться в List.
28	//Соответственно удобно будет сразу отправлять клиенту
29	//этот List с извлеченными данными таблицы как ответ.
30	//С помощью Jackson можно отправить List в JSON формате.
31	//Обработчик ниже возвращает клиенту List JAVA объектов
32	//в формате JSON. Конвертация Java объектов в JSON
33	//происходит "за кулисами" средствами Jackson.
34	//Нашему API нужно просто вернуть List с обьектами
35	//и клиент получит объекты списка в формате JSON.
36	@RequestMapping("/getMusicians")
37	public List<Musician> getMusicians() {
38		List<Musician> musicians = new ArrayList<Musician>();
39		musicians.add(new Musician("Bethoven",true,150));
40		musicians.add(new Musician("Mozart",true,250));
41		musicians.add(new Musician("Bach",true,120));
42		//Возвращаем List
43		return musicians;
44		//То есть можно отправить не один объект
45		//как это делает прошлый обработчик, а сразу много.
46	}
47
48	//Чтобы клиент мог получить конкретного музыканта из списка
49	//он может передать число в путь как показано ниже. 
50	//Это число это индекс в списке и по этому индексу извлекается
51	//конкретный музыкант в списке.
52	@RequestMapping("/getSingleMusicianFromList/{musicianID}")
53	//Аннотация @PathVariable позволяет получить этот 
54        //индекс из пути запроса. Имя аргумента метода должно 
55	//совпадать с именем переменной в URL.
56	public Musician getSingleMusicianFromList(
57			@PathVariable int musicianID) {
58		List<Musician> musicians = new ArrayList<Musician>();
59		musicians.add(new Musician("Bethoven",true,150));
60		musicians.add(new Musician("Mozart",true,250));
61		musicians.add(new Musician("Bach",true,120));
62		//С помощью get достаем из списка нужного музыканта 
63		//исходя из переданного клиентом числа и отправляем
64		//его клиенту в JSON формате.
65		return musicians.get(musicianID);
66	}
67}

Давайте проверим первый обработчик. Вернет ли он нам объект музыканта Bethoven в формате JSON.

Вообще тест можно было бы совершить через адресную строку браузера, как раньше, поскольку в нашем приложении пока только Get запросы, но будем привыкать к Rest Client, так как скоро появятся и post запросы с помощью которых клиентом будет отправляться JSON в обработчик и другие виды запросов.

Перейдем по ссылке getMusician чтобы сделать запрос к первому обработчику:

Как видим обработчик успешно создал объект, конвертировал его в JSON и отправил этот JSON как ответ на запрос.

Кстати, как можно было заметить, вложенный объект мы не создавали, он null. Это было сделано просто чтобы не было слишком много JSON и чтобы показать, что можно конвертировать и отправлять не полностью заполненный объект.

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

Как видим, обработчик успешно конвертировал объекты в списке в JSON и отправил эти JSON как ответ на запрос.

Теперь давайте с помощью третьего обработчика извлечем из списка объектов второй объект. Как мы помним счет начинается с нуля, поэтому чтобы обратиться ко второму элементу в списке пишем в конце ссылки 1.

Как мы помним, второй музыкант в списке был моцарт и как мы видим обработчик успешно его выбрал из списка и прислал в формате JSON.


Дополнительные материалы

Additional Material Icon

Следующие уроки

Создание REST API CRUD приложения

20
мин.

Similar Articles Icon
Divider

Spring Boot: в чём его сила и удобство?

22
мин.

Similar Articles Icon
Divider

Создание Spring Boot CRUD-приложения

20
мин.

Similar Articles Icon