REST — самый частый, но не единственный способ говорить с сервером. Есть две заметные альтернативы, про которые джуну стоит знать в общих чертах. В резюме потом можно будет уверенно сказать «знаком».
GraphQL
Главная альтернатива REST в мире веб-API. Создан в Facebook (Meta) в 2012-м, открыт в 2015-м.
Что меняется по сравнению с REST
В REST у каждого ресурса свой URL. Хочется получить пользователя — /users/42. Хочется его посты — /users/42/posts. Хочется комментарии к каждому посту — ещё запросы. Чтобы отрисовать сложный экран, нужно сделать несколько запросов и собрать данные на клиенте.
В GraphQL — один endpoint, обычно /graphql, на который клиент POST-ит запрос (query) с описанием, что именно ему нужно:
POST /graphql
Content-Type: application/json
{
"query": "
{
user(id: 42) {
name
posts {
title
comments {
text
author { name }
}
}
}
}
"
}
Сервер возвращает ровно те поля, что попросили, в той структуре, в которой попросили:
{
"data": {
"user": {
"name": "Anna",
"posts": [
{ "title": "Привет", "comments": [{ "text": "+1", "author": { "name": "Bob" } }] }
]
}
}
}
Сильные стороны
- Один запрос — полный экран. Меньше round-trip-ов, меньше overfetching (получить 30 полей, использовать 3).
- Типизированная схема. Сервер описывает все типы и связи, инструменты сами генерят клиентский код, документация всегда актуальна.
- Один endpoint — меньше путаницы. Не нужно помнить десятки путей.
Слабые стороны
- Сложнее кэшировать. REST использует HTTP-кэширование «из коробки»; в GraphQL все запросы POST на один URL — стандартный браузерный кэш не работает.
- Сложнее по инфраструктуре. Сервер сложнее (резолверы, защита от тяжёлых запросов, ограничение глубины), клиент часто использует Apollo, Relay, urql — ещё одна зависимость.
- Файлы и стримы — не родные. Грузить аватарку через GraphQL можно, но это всегда хак.
Когда стоит использовать
GraphQL хорошо ложится на сложные сервисы с большим количеством сущностей и связей между ними (соцсети, маркетплейсы, CMS). Плохо — на простые CRUD-сервисы, где REST короче и понятнее.
gRPC
Совсем другой зверь. Создан в Google, опубликован в 2016-м. Используется в основном между серверами, а не для веб-клиентов — но знать про него тоже полезно.
Что отличает
- Бинарный протокол. Данные не в JSON, а в Protocol Buffers — компактном бинарном формате. Парсится быстрее, по сети летит меньше.
- Контракт в .proto-файле. Описываете сервисы и методы в специальном файле, инструменты генерят клиентский и серверный код на любом языке.
- HTTP/2 под капотом. Из коробки multiplexing, streaming в обе стороны, header compression.
- Стримы. Поддерживает unary (запрос → ответ), server streaming, client streaming, bidirectional.
Где живёт
В мире микросервисов — внутри инфраструктуры компании. Сервис заказов общается с сервисом инвентаря через gRPC: быстро, типизированно, без лишних килобайт JSON. Для веб-клиентов чистый gRPC не работает (нет поддержки в браузерах), есть обёртка gRPC-Web — но это всё ещё нишево.
Большинству фронтендеров gRPC напрямую не касается. Но если попадёте в команду, которая делает SDK или общается с микросервисной кухней через прокси — знать про существование стоит.
Кратко в одной таблице
| Подход | Формат | Где сильнее | Где слабее |
| REST | JSON по HTTP | Простые CRUD, кэширование, файлы | Сложные графы данных, overfetching |
| GraphQL | JSON по HTTP, спец-синтаксис | Сложные UI, гибкие выборки | Кэширование, файлы, простые случаи |
| gRPC | Бинарный (Protobuf) по HTTP/2 | Микросервисы, скорость, стримы | Веб-браузеры, отладка глазами |