REST — це не просто модне слово, яке полюбляють розробники. Це архітектурний стиль, який ідеально підходить для мікросервісних систем завдяки своїй простоті, гнучкості та масштабованості. Давайте розберемося, чому.
- Легкість інтеграції: REST використовує протокол HTTP, який підтримують усі сучасні мови програмування, тож ви можете взаємодіяти з мікросервісами на будь-якій платформі.
- Принципи розподілу відповідальностей: REST-додаток розділяє клієнта і сервер, що спрощує управління кодом.
- Масштабованість: ви можете масштабувати мікросервіси залежно від потреб бізнесу, а REST API залишатиметься гнучким засобом для обміну даними.
- Кешування: 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 завдяки набору зручних анотацій:
@RestController: об'єднує в собі@Controllerі@ResponseBody. Вказує, що цей клас надаватиме REST API.@RequestMapping: використовується для задання шляху і методу запиту (наприклад,GET,POST,PUT,DELETE).@GetMapping: спрощена версія@RequestMappingдля HTTP GET.@PostMapping: для HTTP POST.@PutMapping: для HTTP PUT.@DeleteMapping: для HTTP DELETE.@PathVariable: витягування змінних з URI.@RequestParam: витягування параметрів із рядка запиту.@RequestBody: перетворення JSON з тіла запиту в Java-об'єкт.
Реалізація REST API на практиці
Давайте створимо простий REST API для управління замовленнями.
- Створення сутності
Order:// Клас для опису замовлення @Data @AllArgsConstructor @NoArgsConstructor public class Order { private Long id; private String description; private Double totalAmount; } - Реалізація контролера
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!"; } } - Тестування 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 для інших сутностей — наприклад, продуктів, користувачів або транзакцій.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ