JavaRush /Курси /Модуль 5. Spring /Лекція 176: Робота з REST API в мікросервісах

Лекція 176: Робота з REST API в мікросервісах

Модуль 5. Spring
Рівень 12 , Лекція 5
Відкрита

REST — це не просто модне слово, яке полюбляють розробники. Це архітектурний стиль, який ідеально підходить для мікросервісних систем завдяки своїй простоті, гнучкості та масштабованості. Давайте розберемося, чому.

  1. Легкість інтеграції: REST використовує протокол HTTP, який підтримують усі сучасні мови програмування, тож ви можете взаємодіяти з мікросервісами на будь-якій платформі.
  2. Принципи розподілу відповідальностей: REST-додаток розділяє клієнта і сервер, що спрощує управління кодом.
  3. Масштабованість: ви можете масштабувати мікросервіси залежно від потреб бізнесу, а REST API залишатиметься гнучким засобом для обміну даними.
  4. Кешування: REST підтримує кешування відповідей, що зменшує навантаження на сервер.

Отже, REST відмінно підходить для побудови мікросервісів. А тепер — занурюємося в деталі.


Основи REST API в мікросервісах

REST (Representational State Transfer) — це архітектурний стиль, який використовує стандартні HTTP-методи (GET, POST, PUT, DELETE) для роботи з ресурсами.

У мікросервісній архітектурі кожен сервіс зазвичай надає REST API для взаємодії з іншими компонентами системи.

Приклад REST API для мікросервісу "Управління замовленнями"

Уявіть, що ми проектуємо систему управління замовленнями. У нас буде сервіс Order Service, який надає REST API для створення, отримання, оновлення і видалення замовлень.

Приклад ресурсів нашого сервісу:

  • GET /orders: отримання списку замовлень.
  • GET /orders/{id}: отримання інформації про конкретне замовлення.
  • POST /orders: створення нового замовлення.
  • PUT /orders/{id}: оновлення існуючого замовлення.
  • DELETE /orders/{id}: видалення замовлення.

Анотації Spring для REST API

Spring Boot спрощує розробку REST API завдяки набору зручних анотацій:

  1. @RestController: об'єднує в собі @Controller і @ResponseBody. Вказує, що цей клас надаватиме REST API.
  2. @RequestMapping: використовується для задання шляху і методу запиту (наприклад, GET, POST, PUT, DELETE).
  3. @GetMapping: спрощена версія @RequestMapping для HTTP GET.
  4. @PostMapping: для HTTP POST.
  5. @PutMapping: для HTTP PUT.
  6. @DeleteMapping: для HTTP DELETE.
  7. @PathVariable: витягування змінних з URI.
  8. @RequestParam: витягування параметрів із рядка запиту.
  9. @RequestBody: перетворення JSON з тіла запиту в Java-об'єкт.

Реалізація REST API на практиці

Давайте створимо простий REST API для управління замовленнями.

  1. Створення сутності Order:
    
    // Клас для опису замовлення
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Order {
    private Long id;
    private String description;
    private Double totalAmount;
    }
    
  2. Реалізація контролера OrderController:
    
    @RestController
    @RequestMapping("/orders") // Базовий URI для всіх методів
    public class OrderController {
    
        private List<Order> orders = new ArrayList<>();
    
        @GetMapping
        public List<Order> getAllOrders() {
            return orders;
        }
    
        @GetMapping("/{id}")
        public Order getOrderById(@PathVariable Long id) {
            return orders.stream()
                    .filter(order -> order.getId().equals(id))
                    .findFirst()
                    .orElseThrow(() -> new RuntimeException("Order not found"));
        }
    
        @PostMapping
        public Order createOrder(@RequestBody Order order) {
            orders.add(order);
            return order;
        }
    
        @PutMapping("/{id}")
        public Order updateOrder(@PathVariable Long id, @RequestBody Order updatedOrder) {
            Order existingOrder = getOrderById(id);
            existingOrder.setDescription(updatedOrder.getDescription());
            existingOrder.setTotalAmount(updatedOrder.getTotalAmount());
            return existingOrder;
        }
    
        @DeleteMapping("/{id}")
        public String deleteOrder(@PathVariable Long id) {
            Order order = getOrderById(id);
            orders.remove(order);
            return "Order deleted successfully!";
        }
    }
    
  3. Тестування API: Тепер у нас є повний CRUD для замовлень. Ви можете протестувати його за допомогою інструментів, таких як Postman або curl:
    • Створити замовлення: POST /orders з JSON у тілі ({"id":1, "description":"New Order", "totalAmount":100.0}).
    • Отримати всі замовлення: GET /orders.
    • Отримати замовлення за ID: GET /orders/1.
    • Оновити замовлення: PUT /orders/1 з оновленим JSON.
    • Видалити замовлення: DELETE /orders/1.

Поради щодо проєктування REST API

Як обрати URI?

  • Використовуйте іменники в URI: замість /getAllOrders використовуйте /orders.
  • Використовуйте множину для ресурсів: /orders, а не /order.
  • Для вкладених ресурсів дотримуйтесь ієрархії: /orders/{orderId}/items.

Форматування відповідей

  • Повертайте корисні HTTP-коди: 201 Created для створення, 404 Not Found для відсутнього ресурсу.
  • Використовуйте JSON як стандартний формат відповіді (чудово підтримується всіма мовами).

Валідація даних

  • Використовуйте анотацію @Valid для автоматичної валідації.
  • Наприклад:
    
    @PostMapping
    public Order createOrder(@Valid @RequestBody Order order) {
    orders.add(order);
    return order;
    }
    

Обробка помилок

Створіть централізований обробник помилок за допомогою @ControllerAdvice. Приклад:


@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleRuntimeException(RuntimeException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

Безпека REST API

Хоча безпека детально розкривається в інших лекціях, кілька ключових моментів:

  • ніколи не передавайте чутливі дані (наприклад, паролі) в URI.
  • реалізуйте аутентифікацію та авторизацію (див. Spring Security).
  • використовуйте HTTPS для шифрування даних.

Наступні кроки

Ми вивчили, як створювати REST API і працювати з ним у мікросервісній системі за допомогою Spring Boot. На наступній лекції ми заглибимося в практичний приклад і реалізуємо повний REST API мікросервісу, включно з підключенням до бази даних, виконанням міграцій і тестуванням усіх операцій. А поки можете попрактикуватися у створенні власних REST API для інших сутностей — наприклад, продуктів, користувачів або транзакцій.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ