REST – широко распространенная технология передачи данных по протоколу HTTP, которая до недавнего времени была де-факто стандартом веб-разработки. Однако развитие интернета не стоит на месте и у старичка появился конкурент – GraphQL. В этой статье мы рассмотрим преимущества и ограничения обеих технологий: попробуем решить, какую же из них выбрать.
Что такое REST?
REST (Representational State Transfer) – это стиль проектирования API, буквально обозначающий передачу состояния представления. Веб-службы REST используют для передачи и получения информации предопределенный набор операций, включая GET
, POST
, PUT
и DELETE
, и не сохраняют состояние приложения.
Основная идея REST очень проста – на URL-адрес ресурса отправляется запрос определенного типа и формата, на который приходит ответ с нужными данными (обычно в формате JSON).
Преимущества REST
- Масштабируемость. Так как архитектура REST разделяет клиент и сервер, ее легко расширять, что позволяет масштабировать приложение без особых проблем.
- Гибкость. Кроме того, эта архитектура весьма гибкая и дает возможность обрабатывать различные типы запросов и форматы данных.
Ограничения REST
- Чрезмерная выборка. Зачастую конечная точка API предоставляет на запрос лишнюю информацию, которая не требуется клиенту для совершения действий. Например, вы хотите получить только имя пользователя, но метод сообщает вам еще его возраст, телефон и электронную почту.
- Недостаточная выборка. Возможна и обратная ситуация, когда клиенту приходится делать несколько запросов, чтобы получить всю информацию, которая ему нужна. Например, из одной конечной точки API вы получаете личные данные пользователя, а из другой – информацию о сделанных им заказах.
Что такое GraphQL?
GraphQL использует другой стиль проектирования API – все рассматривается как граф, в котором данные взаимосвязаны. Это означает, что запрос можно настроить таким образом, чтобы из одной конечной точки получить всю необходимую информацию – и ничего больше. Таким образом можно даже объединять в одном запросе разные сущности.
Преимущества GraphQL
- Все нужное и ничего лишнего. В GraphQL вы получаете только то, что просите, и больше ничего.
- Быстрая разработка на клиенте. Если нужно изменить что-то в данных, достаточно лишь немного подправить запрос. Это позволяет быстрее развивать продукт. Клиентскую и серверную разработку можно вести независимо друг от друга, при условии, что обе команды знают структуру данных.
Ограничения GraphQL
- Сложность. Для небольших простых приложений настройка таких запросов может показаться слишком сложной и ненужной. В этой ситуации легко можно обойтись классическим REST-подходом.
- Нет кеширования. GraphQL использует всего одну конечную точку, что не позволяет следовать спецификации HTTP-кеширования. Это очень важно, так как кеширование уменьшает объем трафика.

Простой пример для сравнения
Предположим, что мы разрабатываем профиль пользователя с лентой его сообщений и списком подписчиков. Для этого нужно получить информацию о пользователе (как минимум его имя), посты этого автора, а также массив его подписчиков.
REST-реализация
Если мы используем архитектуру REST, то придется сделать несколько запросов (2-3):
/user/<id>
– для получения сведений о пользователе./user/<id>/posts
– для получения списка сообщений, опубликованных этим пользователем./user/<id>/followers
– для получения списка подписчиков.
Скорее всего полученные в каждом случае данные будут избыточны. Например, в первом запросе кроме имени мы получим еще много ненужной информации о пользователе.
GraphQL-реализация
Здесь и проявляется вся мощь GraphQL.
В запросе мы можем указать точный набор нужных данных, например, вот так:
query {
User(id: '123') {
name
posts {
title
}
followers {
name
}
}
}
И в ответ получим именно то, чего ожидаем. Очень просто и чисто.
GraphQL vs REST
Пора подвести итог противостояния. Для этого сравним оба стиля по основным параметрам:
1. Получение данных
У REST есть проблемы с комплектацией: получаемые из конечной точки данные часто бывают избыточными или неполными. У GraphQL этого недостатка нет.
2. Структура ответа
В REST-архитектуре структуру ответа определяет сервер, а в GraphQL – клиентский код.
3. Автоматическое кэширование
REST использует кэширование ответов по умолчанию, в то время как GraphQL не имеет системы автоматического кэширования. Однако существуют различные клиенты GraphQL (Apollo, Relay), которые предоставляют эту возможность.
4. Обработка ошибок
В REST обработка ошибок намного проще. GraphQL обычно возвращает статус 200 OK даже с ошибкой, но при использовании специальных клиентов эта проблема легко решается.
Преимущества GraphQL перед REST очевидны, однако это не всегда лучший вариант для вашего приложения. Выбирая технологию, учитывайте особенности проекта: сложность, размер, потенциальное расширение и организацию процесса разработки.
А что выбираете вы?
Я вот сейчас не понял. Пример с GraphQL Я по правилам GraphQL отправляю запрос на url Там стоит мой обработчик запросов, который парсит запрос и выдает нужный ответ. Чем это отличается от REST?
Я думал REST, это просто согласованные правила по передачи данных для реализации API между разными системами. Но как обрабатывать запросы, я сам пишу логику.
И тут вопрос. Что мне мешает сделать запрос с выборкой? Или сделать обработчик запроса для любых наборов данных, которые смогу в REST описать.
Я не профи, просто я реально не понимаю) Только с REST разбираюсь. А тут граф, который лучше, но как не понятно)
С GraphQL пару лет уже работаю, и хрен я когда вернусь на REST! Если только жизнь не заставит ))
Ограничения реста (Чрезмерная выборка, Недостаточная выборка), зависят от конкретной реализации, что не может являться ограничением в принципе, так что тут немного мимо
ору со статьи, автор, интересно, сам, хоть насколько сильно погружен в работу с графкл? уверен что никак либо крайне поверхностно, иначе эта статья бы не появилась
чет не пойму, что мешает в rest добавлять условия выборки и тем самым получать все что нужно, включая формат в котором нужно вернуть данные?
Ну таким образом вы свой graphql избретаете) На прошлой работе что-то подобное проходили, эта была просто полная жесть
Что-то не особо сильно выйгрывает graphql
Тут в статье не особо раскрыта суть. Для большинства проектов (80%, а то и 90%) graphql НЕ НУЖЕН. У себя мы на него заехали потому что на REST-е было сложно и совсем не гибко работать с организационной структурой очень крупной компании. З.Ы., хоть graphql уже давно не ноу-хау, а стандарт, инструменты разработки до сих пор кривоваты. Нет ни одного нормального расширения Chrome/Firefox для graphql, которое работает стабильно. Тот же самый Apollo (не js-клиент, а расширение) до сих пор полон багов.