В чем разница между GraphQL и REST?

GraphQL и REST – два разных подхода к разработке API для обмена данными через Интернет. REST дает возможность клиентским приложениям обмениваться данными с сервером с помощью команд HTTP – стандартного протокола связи в Интернете. А GraphQL – это язык запросов API, определяющий спецификации, по которым клиентское приложение должно запрашивать данные с удаленного сервера. Вы можете использовать GraphQL в вызовах API для определения запроса, не полагаясь на серверное приложение. GraphQL и REST – две мощные технологии, на которых основывается большинство наших современных приложений.

Подробнее о REST »

Подробнее о реализации GraphQL »

В чем сходство между GraphQL и REST?

И GraphQL, и REST – популярные стили архитектуры API, которые позволяют обмениваться данными между различными сервисами или приложениями в модели «клиент-сервер».

С помощью API можно получить доступ к данным и выполнить такие операции с ними:

  1. Клиент отправляет запрос API одному или нескольким адресам на сервере
  2. Сервер выдает ответ, содержащий данные, состояние данных или коды ошибок

REST и GraphQL позволяют создавать, изменять, обновлять и удалять данные в отдельном приложении, сервисе или модуле через API. API, разработанные с помощью REST, известны как API RESTful или API REST. Те, которые разработаны с помощью GraphQL, представляют собой обычные API GraphQL.

Команды разработчиков внешнего и внутреннего интерфейса используют эти архитектуры API для создания модульных и доступных приложений. Использование архитектуры API помогает обеспечить безопасность, модульность и масштабируемость систем, а также делает системы более производительными и упрощает интеграцию с другими системами.

Далее мы обсудим некоторые другие сходства между GraphQL и REST.

Подробнее об API »

Архитектура

И REST, и GraphQL реализуют несколько общих архитектурных принципов API. Например:

  • Оба варианта не требуют сохранения состояния, поэтому сервер не сохраняет историю ответов между запросами.
  • В обоих случаях используется модель «клиент-сервер», поэтому запросы от одного клиента вызывают ответы от одного сервера
  • Оба протокола основаны на HTTP, поскольку HTTP является базовым протоколом связи

Проектирование на основе ресурсов

И REST, и GraphQL проектируют обмен данными на основе ресурсов. Ресурс – это любые данные или объект, к которым клиент может обращаться и манипулировать ими с помощью API. Каждый ресурс имеет свой уникальный идентификатор (URI) и набор операций (HTTP-методы), которые клиент может выполнять с ним.

Например, рассмотрим API социальных сетей, где пользователи создают публикации и управляют ими. В API, основанном на ресурсах, публикация будет ресурсом. Он имеет свой уникальный идентификатор, например /posts/1234. Кроме того, в нем есть набор операций, таких как запрос GET для получения сообщения в REST или запрос для получения сообщения в GraphQL.

Обмен данными

И REST, и GraphQL поддерживают схожие форматы данных.

JSON – самый популярный формат обмена данными, понятный всем языкам, платформам и системам. Сервер возвращает клиенту данные JSON. Другие форматы данных доступны, но используются реже, например XML и HTML.

Аналогичным образом, REST и GraphQL поддерживают кэширование. Таким образом, клиенты и серверы могут кэшировать часто используемые данные для повышения скорости связи.

Подробнее о JSON »

Нейтральность языка и базы данных

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

Какие ограничения в REST стремится устранить GraphQL?

Технология GraphQL возникла в 2012 году как ответ на потребность в скорости работы развивающихся платформ социальных сетей. Разработчики обнаружили, что существующие архитектуры API, такие как REST, слишком длинные и структурированные для эффективного создания новостных лент.

Далее мы обсудим некоторые проблемы, с которыми они столкнулись.

Обмен данными с фиксированной структурой

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

Чрезмерная и недостаточная выборка

API REST всегда возвращают весь набор данных. Например, от объекта человек в API REST вы получите имя, дату рождения, адрес и номер телефона этого человека. Вы получите все эти данные, даже если вам нужен только номер телефона.

Точно так же, если вы хотите узнать номер телефона человека и последнюю покупку, вам потребуется несколько запросов API REST. URL-адрес /person вернет номер телефона, а URL-адрес /purchase – историю покупок.

Разработчикам социальных сетей приходилось писать много кода только для обработки запросов API, что влияло на производительность и удобство работы пользователей.

Сервис GraphQL появился как решение на основе запросов. Запросы могут возвращать точные данные только за один запрос API и обмен ответами.

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

API REST – это архитектурная концепция обмена данными между приложениями. С другой стороны, GraphQL – это спецификация, язык запросов API и набор инструментов. GraphQL работает на одном адресе с использованием HTTP.

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

Далее приведены некоторые другие различия.

Запрос на стороне клиента

Ниже описано, как работает запрос REST. 

  • Глаголы HTTP, определяющие действие
  • URL-адрес, определяющий ресурс, на котором следует выполнить команду HTTP
  • Параметры и значения для анализа, если вы хотите создать или изменить объект в существующем серверном ресурсе

Например, вы используете запрос GET для получения из ресурса данных, доступных только для чтения, POST для добавления новой записи ресурса или PUT для обновления ресурса.

В отличие от этого, в запросах GraphQL используется следующее:

  • Запрос на получение данных, доступных только для чтения
  • Функция модификации данных
  • Подписка на получение обновлений данных на основе событий или потокового вещания

Формат данных описывает, как сервер должен возвращать данные, включая объекты и поля, соответствующие схеме на стороне сервера. Можно также ввести новые данные. На внутреннем уровне GraphQL отправляет каждый запрос клиента в виде HTTP-запроса POST.

Данные, возвращенные клиенту

В соответствии с архитектурой REST данные возвращаются клиенту с сервера в соответствии со всей структурой ресурсов, указанной сервером. В следующих примерах показаны возвращаемые данные в REST и GraphQL.

Пример возвращаемых данных в REST

В REST запрос GET /posts возвращает следующее:

[

  {

    "id": 1,

    "title": "First Post",

    "content": "This is the content of the first post."

  },

  {

    "id": 2,

    "title": "Second Post",

    "content": "This is the content of the second post."

  },

  {

    "id": 3,

    "title": "Third Post",

    "content": "This is the content of the third post."

  }

]

Пример возвращаемых данных в GraphQL

При использовании GraphQL возвращаются только данные, указанные в структуре, заданной клиентом.

Запрос GET /graphql?query{post(id: 1) {id title content}} возвращает только первое сообщение:

{

  "data": {

    "posts": [

      {

        "id": "1",

        "title": "First Post",

        "content": "This is the content of the first post."

      },

]}}

Схема на стороне сервера

GraphQL использует схему на стороне сервера для определения данных и сервисов данных, которая отличается от API REST.

Схема, написанная на языке определения схемы GraphQL, содержит следующие сведения:

  • Типы объектов и поля, принадлежащие каждому объекту
  • Функции преобразователя на стороне сервера, определяющие операцию для каждого поля

В схеме четко определены типы, описывающие все данные, доступные в системе, и способы доступа клиентов к этим данным или их изменения. 

С другой стороны, для API REST схема на стороне сервера не требуется. Но вы можете определить ее дополнительно для эффективного проектирования API, документации и развития клиентов. 

Управление версиями

По мере развития API их структуры данных и операции могут меняться. Клиенты, не знающие об этих изменениях, могут вывести из строя свои системы или допустить неизвестные ошибки.

Для решения этой проблемы в API REST часто используется функция определения версий в URL, например https://example.com/api/v1/person/12341. Однако управление версиями не является обязательным и может стать причиной ошибок. 

Для GraphQL требуется обратная совместимость API. Таким образом, удаленные поля возвращают сообщение об ошибке, а поля с устаревшим тегом возвращают предупреждение.

Обработка ошибок

GraphQL – это строго типизированная архитектура API, поэтому она требует подробного описания данных, их структуры и операций с данными в схеме. Благодаря уровню детализации схемы система может автоматически выявлять ошибки запроса и предоставлять полезные сообщения об ошибках. 

API REST слабо типизированы и вы должны встроить обработку ошибок в соответствующий код. Например, если запрос PUT анализирует числовое значение как текст, а не как целое число, система автоматически не идентифицирует ошибку.

Когда использовать GraphQL, а когда – REST

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

Например, если вы руководствуетесь этими требованиями, GraphQL, скорее всего, будет более подходящим выбором:

  • У вас ограниченная пропускная способность и вы хотите свести к минимуму количество запросов и ответов
  • У вас есть несколько источников данных и вы хотите объединить их в одном адресе
  • У вас есть запросы клиентов, которые значительно различаются, и вы ожидаете совершенно разных ответов

 

С другой стороны, если вы руководствуетесь этими требованиями, REST, скорее всего, будет более подходящим выбором:

  • У вас есть небольшие приложения с менее сложными данными
  • У вас есть данные и операции, которые все клиенты используют одинаково
  • У вас нет требований к сложным запросам данных

 

Также можно создать единое приложение с API GraphQL и REST для различных сфер деятельности.

Как использовать GraphQL и REST через один и тот же API

Обновление API RESTful до GraphQL возможно без полной перезаписи.

Ниже приводится описание процесса.

  1. Изучите модель данных API RESTful. Для этого исследуйте форму данных в каждом ресурсе URL.
  2. Напишите схему GraphQL из модели данных.
  3. Определите, какие операции клиенты выполняют с данными, и включите их в схему.
  4. Создайте функцию преобразователя в серверном коде для каждого поля схемы.
  5. Создайте сервер GraphQL с преобразователями и схемой.

После этого клиенты могут взаимодействовать с вашим API с помощью GraphQL или REST.

Узнайте, как создавать преобразователи GraphQL »

Краткое описание различий REST и GraphQL

 

REST

GraphQL

Что это

REST – это набор правил, определяющих структурированный обмен данными между клиентом и сервером.

GraphQL – это язык запросов, архитектурный стиль и набор инструментов для создания API и управления ими.

Лучше всего подходит для

REST подходит для простых источников данных, где ресурсы четко определены.

GraphQL подходит для больших, сложных и взаимосвязанных источников данных.

Доступ к данным

В REST имеется несколько адресов в виде URL-адресов для определения ресурсов.

В GraphQL имеется один адрес в виде URL-адреса.

Объем возвращенных данных

REST возвращает данные в фиксированной структуре, определенной сервером.

GraphQL возвращает данные в гибкой структуре, определенной клиентом.

Структурирование и определение данных

Данные REST слабо типизированы. Поэтому клиент должен решить, как интерпретировать отформатированные данные при их возврате.

Данные GraphQL строго типизированы. Таким образом, клиент получает данные в заранее определенных и взаимно понятных форматах.

Проверка ошибок

При использовании REST клиент должен проверить правильность возвращаемых данных.

В GraphQL недействительные запросы обычно отклоняются структурой схемы. В результате появляется автоматически сгенерированное сообщение об ошибке.

Как AWS обеспечивает соответствие вашим требованиям к GraphQL и REST?

Amazon Web Services (AWS) помогает создавать и обслуживать более управляемые API.

AWS AppSync создает бессерверные API GraphQL и API для публикации и подписки (pub/sub). Они упрощают разработку приложений с помощью единого адреса для безопасной подачи запроса, обновления или публикации данных.

С помощью AWS AppSync вы создаете API, которые позволяют клиентам выполнять следующие действия:

  • Взаимодействие с несколькими источниками данных (SQL, NoSQL, данные поиска, адреса REST и микросервисы) с использованием одного сетевого вызова
  • Автоматическая синхронизация данных между мобильными и веб-приложениями и облаком
  • Передача данных из серверной части подключенным клиентам и между ними
  • Доступ к данным Интернета вещей (IoT) для создания информационных панелей в реальном времени в мобильном или веб-приложении

Аналогичным образом, API шлюз Amazon – это полностью управляемый сервис, предназначенный для создания, публикации, обслуживания, мониторинга и обеспечения безопасности API в любых масштабах.

Ниже перечислены другие преимущества использования API шлюза.

  • Предоставление пользователям высокой производительности при запросах и ответах API
  • Авторизованный доступ к вашим API
  • Одновременный запуск нескольких версий одного и того же API, позволяющий быстро дорабатывать, тестировать и запускать новые версии
  • Отслеживание метрик производительности и информации о вызовах API, задержке данных и частоте ошибок

Начните работать с GraphQL и REST на AWS, создав аккаунт сегодня.

AWS: дальнейшие шаги

Начать разработку с GraphQL

Узнайте, как начать работу с GraphQL на AWS

Подробнее 
Начните разрабатывать с помощью REST

Узнайте, как начать работу с REST на AWS

Подробнее