Бесплатный курс по Java: от основ до продвинутого уровня
Первое Spring REST API-приложение
Создадим свое собственное Rest Api. То есть мы создадим набор методов, к которым можно будет обращаться http запросом по ссылке. Эти методы будут возвращать java объекты конвертированные в JSON тому кто сделал запрос.
Создадим Мавен приложение с такой структурой и файлами:
В файле MainController будут находиться обработчики, которые будут принимать http запрос, конвертировать java объекты в JSON и отправлять этот JSON обратно тому кто сделал запрос.
В classes находятся классы, объекты которых будут конвертироваться в JSON.
Теперь давайте добавим необходимые зависимости в pom файл чтобы приложение работало. А именно Jacksonдля конвертации из JSON в объект и наоборот.
Здесь можно увидеть все типы информации, которые можно хранить в JSON.
В первых трех записях можно увидеть, что можно хранить разные типы данных, в нашем случае – string, boolean и int.
В четвертой записи можно увидеть, что в JSON также можно хранить массивы. Его элементы перечисляются в квадратных скобочках.
В пятой записи можно увидеть, что в JSON также можно хранить вложенный JSON. В нем хранятся данные, которые описывают самую известную работу автора Bethoven.
Зачем шестая запись дальше будет объеснено.
Давайте создадим класс музыканта объект которого будет конвертироваться в JSON подобный тому, что приведен выше и наоборот должна быть возможность конвертации JSON выше в объект класса ниже. Как можно увидеть он содержит такие же типы информации как и json, который был выше – три поля, массив и вложенный объект. Как уже говорилось для успешной конвертации имена сеттеров и геттеров в этом классе должны содержать имена записей из JSON.
package com.MavenWebAps.RestWebApp.convertFromJsonjson;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
//Аннотация @JsonIgnoreProperties нужна просто
//чтобы приложение не выдало ошибку если в классе
//нет каких-то полей, которые есть в JSON, который
//конвертируется в объект на основе этого класса.
//В нашем случае это “somePropToIgnore”: “ignoreMe”.
//Как можно увидеть в классе ниже нет поля
//соответствующего записи
//”somePropToIgnore”: “ignoreMe” в JSON.
@JsonIgnoreProperties(ignoreUnknown=true)
public class Musician {
private String musician_name;
private boolean isclassic;
private int numofoperas;
private String[] gratest_works;
//В JSON файле приведенном ранее можно
//увидеть вложенный JSON: “theMostFamousWork”:
//{“work_name”: “Symphony No. 3 ‘Eroica'”, …}
//Этот вложенный JSON сконвертируется как
//внутренний объект объекта класса Musician.
//Класс этого внутреннего объекта нам тоже нужно
//создать. Поэтому ниже в следующем примере
//кода после текущего создается
//класс TheMostFamousWork.
private TheMostFamousWork theMostFamousWork;
public Musician() {
}
public Musician(String musician_name,
boolean isclassic, int numofoperas) {
this.musician_name = musician_name;
this.isclassic = isclassic;
this.numofoperas = numofoperas;
}
//Заметьте что названия геттерам и сеттерам даны
//в соответствии с именами данных в JSON, то есть
//левой части записей. Например сеттер и геттер
//ниже для записи “musician_name” : “Behoven”
//содержит имя левой части этой записи.
//Имена очень важно давать именно такие
//чтобы конвертация происходила успешно.
public String getMusician_name() {
return musician_name;
}
public void setMusician_name(
String musician_name) {
this.musician_name = musician_name;
}
public boolean isIsclassic() {
return isclassic;
}
public void setIsclassic(boolean isclassic) {
this.isclassic = isclassic;
}
public int getNumofoperas() {
return numofoperas;
}
public void setNumofoperas(int numofoperas) {
this.numofoperas = numofoperas;
}
public String[] getGratest_works() {
return gratest_works;
}
public void setGratest_works(
String[] gratest_works) {
this.gratest_works = gratest_works;
}
public TheMostFamousWork getTheMostFamousWork() {
return theMostFamousWork;
}
public void setTheMostFamousWork(
TheMostFamousWork theMostFamousWork) {
this.theMostFamousWork = theMostFamousWork;
}
}
Создадим теперь класс вложенного в музыканта объекта.
*TheMostFamousWork.java
package com.MavenWebApps.RestWEBApp.convertfromjsoncl;
public class TheMostFamousWork {
private String work_name;
private String dedicatedTo;
private int ComposedIn;
public TheMostFamousWork() {
}
public String getWork_name() {
return work_name;
}
public void setWork_name(String work_name) {
this.work_name = work_name;
}
public String getDedicatedTo() {
return dedicatedTo;
}
public void setDedicatedTo(String dedicatedTo) {
this.dedicatedTo = dedicatedTo;
}
public int getComposedIn() {
return ComposedIn;
}
public void setComposedIn(int composedIn) {
ComposedIn = composedIn;
}
}
Давайте же создадим Api, то есть набор методов, которые можно вызывать по ссылке используя http запросы. Делается это конечно же в контроллере, который представлен ниже.
package com.MavenWebAps.RestWEBApp.controller;
import java.util.ArrayList;
//Напишем свое REST Api!
//В Spring MVC для обработки http методов и автоматической
//конвертации из JSON в java объекты используеться
//@RestController вместо @Controller, который был раньше.
@RestController
public class MainController {
//Этим обработчиком просто отправляем в ответ
//тому кто сделал запрос по адресу /getMusician
//объект класса Musician в JSON формате.
//Конвертация Java объектов в JSON и наоборот
//происходит “за кулисами” средствами Jackson,
//ничего специального для конвертации делать
//не нужно. Просто возвращаем объект из метода
//и он автоматически отправляеться тому кто
//вызвал метод по ссылке /getMusician
//в JSON формате.
@RequestMapping(“/getMusician”)
public Musician getMusician() {
return new Musician(“Bethoven”,true,150);
}
//Помним что результат запроса SELECT для извлечения
//нескольких записей из таблицы, который совершаеться
//средствами hibernate, записываеться в List.
//Соответственно удобно будет сразу отправлять клиенту
//этот List с извлеченными данными таблицы как ответ.
//С помощью Jackson можно отправить List в JSON формате.
//Обработчик ниже возвращает клиенту List JAVA объектов
//в формате JSON. Конвертация Java объектов в JSON
//происходит “за кулисами” средствами Jackson.
//Нашему API нужно просто вернуть List с обьектами
//и клиент получит объекты списка в формате JSON.
@RequestMapping(“/getMusicians”)
public List getMusicians() {
List musicians = new ArrayList();
musicians.add(new Musician(“Bethoven”,true,150));
musicians.add(new Musician(“Mozart”,true,250));
musicians.add(new Musician(“Bach”,true,120));
//Возвращаем List
return musicians;
//То есть можно отправить не один объект
//как это делает прошлый обработчик, а сразу много.
}
//Чтобы клиент мог получить конкретного музыканта из списка
//он может передать число в путь как показано ниже.
//Это число это индекс в списке и по этому индексу извлекается
//конкретный музыкант в списке.
@RequestMapping(“/getSingleMusicianFromList/{musicianID}”)
//Аннотация @PathVariable позволяет получить этот
//индекс из пути запроса. Имя аргумента метода должно
//совпадать с именем переменной в URL.
public Musician getSingleMusicianFromList(
@PathVariable int musicianID) {
List musicians = new ArrayList();
musicians.add(new Musician(“Bethoven”,true,150));
musicians.add(new Musician(“Mozart”,true,250));
musicians.add(new Musician(“Bach”,true,120));
//С помощью get достаем из списка нужного музыканта
//исходя из переданного клиентом числа и отправляем
//его клиенту в JSON формате.
return musicians.get(musicianID);
}
}
Давайте проверим первый обработчик. Вернет ли он нам объект музыканта Bethoven в формате JSON.
Вообще тест можно было бы совершить через адресную строку браузера, как раньше, поскольку в нашем приложении пока только Get запросы, но будем привыкать к Rest Client, так как скоро появятся и post запросы с помощью которых клиентом будет отправляться JSON в обработчик и другие виды запросов.
Перейдем по ссылке getMusician чтобы сделать запрос к первому обработчику:
Как видим обработчик успешно создал объект, конвертировал его в JSON и отправил этот JSON как ответ на запрос.
Кстати, как можно было заметить, вложенный объект мы не создавали, он null. Это было сделано просто чтобы не было слишком много JSON и чтобы показать, что можно конвертировать и отправлять не полностью заполненный объект.
Далее протестируем второй обработчик. Как мы помним, он должен возвращать много объектов конвертированных в JSON.
Как видим, обработчик успешно конвертировал объекты в списке в JSON и отправил эти JSON как ответ на запрос.
Теперь давайте с помощью третьего обработчика извлечем из списка объектов второй объект. Как мы помним счет начинается с нуля, поэтому чтобы обратиться ко второму элементу в списке пишем в конце ссылки 1.
Как мы помним, второй музыкант в списке был моцарт и как мы видим обработчик успешно его выбрал из списка и прислал в формате JSON.