Что такое GraphQL и чем он отличается от REST?

Ответ

GraphQL — это язык запросов для API и среда выполнения для этих запросов. Он позволяет клиенту точно описать, какие данные ему нужны, и получить их в одном запросе, решая проблемы избыточной или недостаточной загрузки данных, характерные для REST.

Ключевые отличия от REST:

Характеристика REST GraphQL
Эндпоинты Множество эндпоинтов (/users, /posts/:id) Обычно один эндпоинт (/graphql)
Структура ответа Определяется сервером Определяется клиентом в запросе
Загрузка данных Часто приводит к over-fetching (лишние данные) или under-fetching (нужно делать доп. запросы) Клиент получает ровно те данные, которые запросил
Типизация Не встроена в стандарт (используются внешние спецификации, как OpenAPI) Строгая система типов — основа языка. Схема API является контрактом.

Пример запроса GraphQL:

Клиент хочет получить имя пользователя и заголовки только его постов. Он формирует запрос, точно описывающий нужную структуру:

query GetUserWithPosts {
  user(id: "1") {
    name
    posts {
      title
    }
  }
}

Основные концепции GraphQL:

  • Схема (Schema): Определяет все типы данных и операции, доступные в API.
  • Запросы (Query): Операции для чтения данных.
  • Мутации (Mutation): Операции для изменения данных (создание, обновление, удаление).
  • Подписки (Subscription): Позволяют клиентам подписываться на события и получать обновления в реальном времени (например, через WebSockets).

В Go для создания GraphQL-серверов популярны библиотеки gqlgen и graphql-go/graphql.

Ответ 18+ 🔞

Давай разберём эту вашу GraphQL-штуку, а то как будто про космос говорят, а на деле всё проще, чем кажется.

Представь себе ресторан. REST — это как стандартное меню: вот суп, вот второе, вот компот. Хочешь только котлету из второго? Не, братан, получишь всё блюдо целиком, с пюрешкой и салатом, которые тебе нахуй не сдались. Это over-fetching, лишняя загрузка. А хочешь ещё и пирожок на десерт? Делай новый заказ, иди нахуй. Это under-fetching, недозагрузка.

А GraphQL — это как шеф-повар, который выходит к тебе и говорит: «Ну чё, пацан, накидывай, что конкретно хочешь, я соберу в одну тарелку». Хочешь только имя юзера и заголовки его постов? Без проблем, ёпта. Получаешь ровно это и ни грамма лишнего.

Чем они вообще отличаются, эти ваши технологии?

Прикол REST GraphQL
Точки входа Их дохуя. /users, /posts, /cats — как будто по всему офису разбросаны кнопки. Обычно одна, блядь. /graphql. Всё, точка. Сюда все запросы и летят.
Что прилетает в ответ Что сервер захочет, то и пришлёт. Как повезёт. То, что ты в запросе чётко прописал. Сам виноват, если не дописал.
Проблемы с данными Классика: либо тебе пол-API пришлют, либо заставят бегать по эндпоинтам как угорелому. Клиент — царь и бог. Запросил три поля — получил три поля.
Типы данных Ну, там какие-то свои документы на стороне, OpenAPI, хер пойми что. Всё строго, по-взрослому. Схема API — это святое. Там каждый тип расписан, и если запросишь несуществующее поле — получишь по рукам сразу.

Вот смотри, как запрос выглядит, реальный пример:

Допустим, тебе от юзера нужно только имя и заголовки его постов. Никаких лишних email'ов, дат рождения и прочей хуйни. Пишешь запрос:

query GetUserWithPosts {
  user(id: "1") {
    name
    posts {
      title
    }
  }
}

И всё, ёбта! Сервер, как послушный пёс, принесёт структуру, где будет только name и массив posts, внутри которого только title. Никакого мусора. Красота, в рот меня чих-пых!

Из чего эта магия состоит?

  • Схема (Schema): Это как конституция твоего API. В ней прописано, какие вообще бывают типы данных (User, Post) и что с ними можно делать. Без неё — пиздец и анархия.
  • Запросы (Query): Это когда ты просто читаешь данные. «Дай-ка мне то, дай-ка мне это».
  • Мутации (Mutation): А это когда ты уже меняешь что-то. «Создай юзера», «Обнови пост», «Удали эту дичь». Операции с последствиями, блядь.
  • Подписки (Subscription): Вообще охуенная штука! Это как подписаться на паблик. Хочешь получать уведомления в реальном времени, когда новый комментарий появляется? Подписался — и тебе стримом летят обновления, обычно через WebSockets. Не нужно постоянно опрашивать сервер «Ну чё там? А щас?».

А если ты на Go пилишь, то смотри в сторону библиотек gqlgen или graphql-go/graphql. Они тебе всю эту кухню с типами и схемами помогут организовать, чтобы не охуеть от количества boilerplate-кода.