JavaRush /Java блог /Random UA /Spring – це не страшно. Контролюємо свій REST
Павел
11 рівень

Spring – це не страшно. Контролюємо свій REST

Стаття з групи Random UA
ЗМІСТ ЦИКЛУ СТАТЕЙ Перевикористання чужої праці – це свята справа для будь-якого розробника 😌 Щоб рухатися далі, необхідно розуміти основи комп'ютерної мережі, ось серія статей . Зверніть увагу на основні моменти: принцип роботи 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 " 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», інтернет ще ніхто не скасовував) Робота з контролерами на цьому не закінчується, попереду ще багато тем .
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ