Spring — это не страшно. Контролируем свой REST

Статья из группы Java Developer
СОДЕРЖАНИЕ ЦИКЛА СТАТЕЙ Переиспользование чужого труда — это святое дело для любого разработчика 😌 Чтобы двигаться дальше, необходимо понимать основы компьютерной сети, вот серия статей. Обратите внимание на основные моменты: принцип работы HTTP, что такое GET, POST, PUT, статусы ответов, MVC , про JSON и сериализацию читайте отдельно. Будет полезно реализовать предложенный пример с сервлетами, это поможет полюбить spring-boot всей душой. Пример приложения на spring-boot из данного цикла, довольно прост, но он поможет понять суть MVC. Ниже будет ссылка на проект по интереснее. Для ознакомления с REST и использованием его в Spring прочитайте, вот эти три статьи. В первой статье почитаете что такое REST. Во второй статье говориться о запросах и ответах, обязательно прочитайте и примите к сведению комментарий товарища Fidel. В третьей статье будет предложен практический пример реализации на Spring, подход к созданию приложения не много другой (полезно посмотреть и сравнить), реализуйте его. Обратите внимание на место где говориться про HttpStatus, ResponseEntity <?> (если <?> вводит в ступор, то читайте главу 13. Обобщения из "Java. Руководство для начинающих", Герберт Шилдт ), в этой же статье почитайте про POSTMAN (дополнительно короткое видео про него) установите POSTMAN, все возможности вам не нужны, посмотрите, как создавать различные запросы. В примере встречаются тернарные операторы , освежите в памяти, если забыли. Обратите внимание на то, как в примере статьи реализовано внедрение бинов с использованием @Autowired

@RestController
public class ClientController {

   private final ClientService clientService;

   @Autowired
   public ClientController(ClientService clientService) {
       this.clientService = clientService;
   }
}
Необходимо знать, что начиная с версии Spring 4.3 аннотацию @Autowired можно опустить, если у класса всего один конструктор. О том, что в конструкторе надо внедрить бин, фреймворк догадается сам. Подробнее можно прочитать в этом источнике. И если вы будете внимательны, то у вас должен возникнуть вопрос по структуре пакета service, а именно: зачем там interface ClientService и public class ClientServiceImpl – это правильная практика, позднее, мы поговорим зачем она нужна и будем ее использовать. Со статьями всё. Прежде чем читать, давайте по пишем. Как говориться: «Ни дня без кода!» Для затравки создадим простой GET запросик. В прошлый раз мы написали приложение для спекуляции овощами, git clone https://FromJava@bitbucket.org/FromJava/speculation.git git clone git@bitbucket.org:FromJava/speculation.git Открываем приложение, и в пакете ru.java.rush создадим пакет controllers (здесь будут располагаться контролеры из паттерна MVC). Создаем класс public class ProductController

@RestController
@RequestMapping("/speculation")
public class ProductController {

}
Аннотация @RestController – указывает Spring что это рест-контроллер. @RequestMapping – все методы контроллера будут получать запросы с URI, который будет начинаться строкой, указанной в скобках аннотации ("/speculation"). Пишем в классе следующий метод

@GetMapping("/simple")
public String simple(){
    return "Легкий GET запросик";
}
Запускаем проект, в строке браузера набираем: http://localhost:8080/speculation/simple Получаем ответ: Легкий GET запросик Немного объяснений: 1. Мы создали класс, который пометили @RestController как контроллер, указали к нему путь @RequestMapping ("/speculation") – эта аннотация является не обязательной, без нее путь будет начинаться с "/". 2. Мы создали метод, который при выполнении возвращает строку (Легкий GET запросик), пометили его аннотацией @GetMapping (что этот метод именно для GET запросов) и указали к методу путь ("/simple") 3. Запустили проект (сервер) на порту 8080, и сделали GET запрос по адресу: сервер/ контроллер/метод (http://localhost:8080/speculation/simple) 4. По данному запросу отработал метод public String simple(){ return "Легкий GET запросик"; } 5. Результат работы метода вернулся в браузер в виде строки "Легкий GET запросик". Ну что, начало положено! Вас ждут увлекательнейшие стати. Освоение предложенного выше материала займет не один день, здесь торопиться не надо, эта тема очень важна и ее необходимо понять, «ешьте слона по частям». Для тренировки(после освоения материала): Дополните контроллер приложения speculation . Создайте методы: 1) Поиск товара по id Используйте метод productService.findById(); Пример вывода

{
        "id": 1,
        "name": "Картофель",
        "purchasePrice": 20,
        "packaging": null,
        "salePrice": null
 }
После реализации остальных методов контроллера, подумайте: "Почему в двух последних полях стоят null? Что нужно сделать, что бы там оказались какие нибудь значения?" 2) Просмотр всех продуктов на витрине: Для поиска всех продуктов используйте метод productService.findAll(); Для заполнения полей упаковки и наценки используйте productService.pack(); productService.makeMoney(); на выводе должен быть массив JSON-ов с перечислением товаров, пример:

[
    {
        "id": 1,
        "name": "Картофель",
        "purchasePrice": 20,
        "packaging": "Упаковано в лучшем виде",
        "salePrice": 100
    },
    {
        "id": 2,
        "name": "Морковь",
        "purchasePrice": 14,
        "packaging": "Упаковано в лучшем виде",
        "salePrice": 70
    }
]
3) Добавления нового товара в БД (добавьте товар:капуста и цену оптовой закупки) Используйте: productService.save(); Метод должен вернуть соответствующий Http статус. 4) Удаления товара по id Для этого, сначала реализуйте в ProductService метод, содержащий productRepository.deleteById(); А затем, используйте его в контроллере. Метод контроллера должен вернуть соответствующий Http статус. 5) Изменения товара по id (изменение оптовой цены товара и наименования товара) Эта операция будет по сложнее предыдущих. Сначала необходимо найти товар, который мы хотим изменить по id Используйте productService.findById(); Затем, в найденном товаре (объекта) замените значение полей, на значение полей объекта, полученного в теле Put запроса (объект_json) Это можно сделать примерно так:

найденный_товар = productService.findById(id);
найденный_товар.setName(объект_json.getName);
найденный_товар.setPurchasePrice(объект_json.getPurchasePrice);
После этого измененный товар необходимо сохранить productService.save(найденный_товар); Метод должен вернуть соответствующий Http статус. Если с этим методом возникнут проблемы, то можно погуглить «put запрос java», интернет еще никто не отменял) Работа с контроллерами на этом не заканчивается, впереди еще много тем…
Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Богдан Уровень 29, Одесса
27 января 2021
Павел, подскажите, эти методы: Для заполнения полей упаковки и наценки используйте

productService.pack();
productService.makeMoney();
где стоит вызвать? Я так понимаю в REST контроллере им не место (нарушение Single Responsibility).