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

Создадим crud приложение только теперь с использованием REST.

Создадим новое Maven приложение с такими папками и файлами.

Содержимое файлов в этом crud приложении ничем не отличается от содержимого предыдущего crud приложения, которое мы создавали, за исключением содержимого файла контроллера и pom файла, в который просто нужно добавить зависимость для поддержки jackson.

Рассмотрим содержимое файла контроллера, в котором собственно пишется api.

Заметьте что в Mapping-ах внизу повторяющиеся адреса /actors.

Это стандартная практика в spring rest приложениях, что для разных операций с тем или иным конкретным классом (в данном случае с Actor) используется один и тот же адрес, а получатель запроса (получатель это RestController) будет распознавать какой из обработчиков вызывать основываясь на HTTP методе присланного запроса

То есть крайне не желательно называть адреса по разному. Например: /getallactors, /getactorfromdb, /savesingleactor/{actorID} и т.д.

Лучше пусть контроллер сам распознает какой из обработчиков вызывать по HTTP методу запроса.

  • Get запрос будет вызывать обработчик помеченный аннотацией @GetMapping,
  • Post запрос будет вызывать обработчик помеченный аннотацией @PostMapping,
  • Put запрос будет вызывать обработчик помеченный аннотацией @PutMapping,
  • Delete запрос будет вызывать обработчик помеченный аннотацией @DeleteMapping)
package com.MavenWebApps.RestWebApplicationCRUD.controller; import java.util.List; @RestController public class MainController { @Autowired private ServiceInterface serviceclass; //READ. Всех актеров @GetMapping(“/actors”) public List getActors() { return serviceclass.getListOfActors(); } //READ. Одного актера @GetMapping(“/actors/{actorID}”) public Actor getActor( @PathVariable int actorID){ Actor actor = serviceclass.getActor(actorID); return actor; } //CREATE @PostMapping(“/actors”) public Actor addActor( @RequestBody Actor actor) { //Из нового здесь можно увидеть //аннотацию @RequestBody, //но здесь ничего сложного. //Когда клиентом посылается JSON //методом POST в наш контроллер //средства Jackson конвертируют //за кулисами этот JSON в объект actor //и мы можем использовать этот объект. //В этом обработчике мы добавляем //присланного актера в базу. serviceclass.saveActor(actor); return actor; } //UPDATE @PutMapping(“/actors”) public Actor updateActor( @RequestBody Actor actor) { serviceclass.saveActor(actor); return actor; } //DELETE @DeleteMapping(“/actors/{actorID}”) public String deleteActor( @PathVariable int actorID) { serviceclass.deleteActor(actorID); return “Deleted customer id – ” +actorID; } }

Давайте же протестируем созданные обработчики.

В таблице actor сейчас три актера:

Давайте получим данные всех актеров в формате JSON через обработчик getActors. Этот обработчик извлекает актеров из БД помещает их в List и отправляет этот List с актерами в формате JSON.

Обратимся к этому обработчику через Rest Client по ссылке /actors запросом GET. RestController распознает, что был сделан GET запрос и вызывает обработчик помеченный аннотацией GetMapping.

Как видим, List с объектами актеров из БД успешно пришел в формате JSON в ответ на GET запрос.

Давайте получим данные одного конкретного актера в формате JSON через обработчик getActor. Этот обработчик извлекает конкретного актера из БД по присланному в ссылке id этого актера и отправляет его в формате JSON.

Обратимся к этому обработчику через Rest Client по ссылке /actors/2 запросом GET чтобы получить JSON актера с id два. RestController распознает, что был сделан GET запрос и вызывает обработчик помеченный аннотацией GetMapping. Но в этот раз уже тот где ссылка /actors/{actorID}, а не просто /actors

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

Теперь давайте добавим нового актера в БД через обработчик addActor. Этот обработчик получает информацию нового актера в формате JSON, конвертирует этот JSON в объект класса Actor и добавляет этот объект в БД. Также он возвращает данные добавленного актера в формате JSON в ответ на POST запрос.

Обратимся к этому обработчику через Rest Client по ссылке /actors запросом POST, при этом во вкладке BODY пишем в формате JSON данные актера, которого мы хотим отправить в контроллер и добавить БД. RestController распознает, что был сделан POST запрос и вызывает обработчик помеченный аннотацией PostMapping.

Выше видим, что обработчик успешно отправил в ответ на POST запрос данные добавленного в БД актера в формате JSON. Ниже можно увидеть, что актер успешно добавился в БД.

Теперь давайте обновим присутствующего актера в БД через обработчик updateActor. Этот обработчик получает новую информацию для обновления существующего в БД актера в формате JSON, конвертирует этот JSON в объект класса Actor и обновляет актера в БД исходя из id, который был передан в JSON. Также он возвращает данные обновленного актера в формате JSON в ответ на PUT запрос.

Обратимся к этому обработчику через Rest Client по ссылке /actors запросом PUT, при этом во вкладке BODY пишем в формате JSON данные актера, которого мы хотим отправить в контроллер и обновить в БД, при этом в отправляемом JSON обязательно нужно указать id актера, которого мы хотим обновить. RestController распознает, что был сделан PUT запрос и вызывает обработчик помеченный аннотацией PutMapping.

Выше видим, что Обработчик успешно отправил в ответ на PUT запрос данные обновленного в БД актера в формате JSON. Ниже можно увидеть, что актер с id четыре успешно обновился в БД. Naomi Watts изменилось на Michael Pitt.

Давайте удалим конкретного актера из БД через обработчик deleteActor. Этот обработчик удаляет конкретного актера из БД по присланному в ссылке id этого актера и отправляет сообщение, что актер с таким-то id удален из БД.

Обратимся к этому обработчику через Rest Client по ссылке /actors/4 запросом DELETE чтобы удалить из БД актера с id четыре. RestController распознает, что был сделан DELETE запрос и вызывает обработчик помеченный аннотацией DeleteMapping.

Выше видим, что Обработчик успешно отправил в ответ на DELETE запрос сообщение о том, что удален актер с id четыре. Ниже можно увидеть, что актер с id четыре успешно удалился из БД.

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

Преимущества Spring Boot: автоконфигурация, встроенный Tomcat, starter-зависимости. Настройка через Spring Initializr и application.properties.
Time to read: 22

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

Spring Boot + JPA + Hibernate: создание CRUD API. EntityManager для работы с разными реализациями JPA. Настройка через application.properties.
Time to read: 20

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

Используйте JpaRepository для CRUD без ручного DAO. Готовые методы save(), findAll(). Сравнение с классической реализацией Spring MVC.
Time to read: 20