Три поширені стилі API розв'язують різні задачі.
REST - ресурси за URL і стандартні методи HTTP:
GET /api/orders/42
GET /api/orders/42/items
- сильні сторони: простота, HTTP-кешування (CDN,
ETag), зрозумілі коди відповіді, будь-який клієнт (навітьcurl); - слабкі: клієнт отримує фіксовану форму відповіді - або зайві поля (overfetching), або кілька запитів, щоб зібрати екран (underfetching).
GraphQL - один ендпойнт, клієнт сам описує, які поля потрібні:
query {
order(id: 42) { number total items { name qty } customer { name } }
}
- сильні сторони: один запит на екран, сувора схема з типами, зручно для кількох клієнтів з різними потребами (веб, мобільний застосунок);
- слабкі: складніше кешування (зазвичай
POSTна один URL), ризик дорогих запитів, N+1 на сервері, складніші авторизація й обмеження частоти.
gRPC - виклик віддалених процедур поверх HTTP/2 з бінарним форматом Protocol Buffers і згенерованими клієнтами:
- сильні сторони: швидкість і компактність, суворий контракт у
.proto, двобічний стримінг; - слабкі: браузер не викликає gRPC напряму (потрібен gRPC-Web чи шлюз), бінарні повідомлення важче налагоджувати.
Як обирати:
| Ситуація | Стиль |
|---|---|
| публічне API, інтеграції партнерів, вебхуки | REST |
| багато клієнтів з різними екранами, складні зв'язані дані | GraphQL |
| внутрішні сервіси між собою, високе навантаження, стримінг | gRPC |
| прості дії на кшталт «надіслати лист» | RPC поверх HTTP (POST /api/send-invoice) |
Практичне зауваження: для типового Laravel-застосунку з одним фронтендом REST (чи Inertia без окремого API) майже завжди простіший. GraphQL і gRPC окупаються, коли їхні сильні сторони справді потрібні, - а не «бо модно».