В чем разница REST и GraphQL?
Что проверяют
Умеете ли вы сравнивать подходы по последствиям для клиента и сервера, а не по лозунгу «GraphQL современнее».
Как отвечать
REST это набор ресурсов с адресами и методами HTTP, форма ответа задаётся сервером. GraphQL это один адрес и язык запросов, где форму ответа задаёт клиент, а схема описывает, что вообще можно спросить.
Что даёт GraphQL:
- клиент берёт ровно нужные поля, поэтому нет ни лишних данных, ни похода за недостающими;
- связанные сущности собираются одним запросом вместо трёх последовательных, что особенно заметно на мобильной сети;
- схема типизирована и служит документацией, а инструменты генерируют по ней клиентский код;
- развитие обычно идёт без версий: поля добавляются, старые помечаются устаревшими.
Что даёт REST:
- кеширование по адресу работает из коробки: браузер, промежуточные узлы, CDN;
- коды ответов и семантика методов понятны любому инструменту, отладка проще;
- предсказуемая нагрузка на сервер, тогда как в GraphQL клиент может запросить тяжёлое дерево, и приходится ограничивать глубину и сложность запроса;
- загрузка файлов и потоковые сценарии выглядят естественнее.
Отдельно назовите проблему N+1 на сервере GraphQL: наивное разрешение полей порождает лавину запросов к базе, лечится пакетной загрузкой (DataLoader). И то, что кеширование в GraphQL переезжает на клиент, например в нормализованный кеш Apollo.
Вывод: много разных клиентов с разными потребностями в данных, это GraphQL; простое API с сильной ролью кеширования и одним потребителем, это REST.
Где спотыкаются
Говорят «GraphQL быстрее». Он экономит запросы и трафик, но на сервере может быть дороже.
Забывают, что ошибки в GraphQL приходят с кодом 200 и полем errors, и обработку надо писать иначе.
Не упоминают ограничение сложности запросов, из-за чего публичное API легко положить одним запросом.