В чем разница между GraphQL и REST?
GraphQL и REST – два разных подхода к разработке API для обмена данными через Интернет. REST дает возможность клиентским приложениям обмениваться данными с сервером с помощью команд HTTP – стандартного протокола связи в Интернете. А GraphQL – это язык запросов API, определяющий спецификации, по которым клиентское приложение должно запрашивать данные с удаленного сервера. Вы можете использовать GraphQL в вызовах API для определения запроса, не полагаясь на серверное приложение. GraphQL и REST – две мощные технологии, на которых основывается большинство наших современных приложений.
В чем сходство между GraphQL и REST?
И GraphQL, и REST – популярные стили архитектуры API, которые позволяют обмениваться данными между различными сервисами или приложениями в модели «клиент-сервер».
С помощью API можно получить доступ к данным и выполнить такие операции с ними:
- Клиент отправляет запрос API одному или нескольким адресам на сервере
- Сервер выдает ответ, содержащий данные, состояние данных или коды ошибок
REST и GraphQL позволяют создавать, изменять, обновлять и удалять данные в отдельном приложении, сервисе или модуле через API. API, разработанные с помощью REST, известны как API RESTful или API REST. Те, которые разработаны с помощью GraphQL, представляют собой обычные API GraphQL.
Команды разработчиков внешнего и внутреннего интерфейса используют эти архитектуры API для создания модульных и доступных приложений. Использование архитектуры API помогает обеспечить безопасность, модульность и масштабируемость систем, а также делает системы более производительными и упрощает интеграцию с другими системами.
Далее мы обсудим некоторые другие сходства между GraphQL и REST.
Архитектура
И 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 поддерживают кэширование. Таким образом, клиенты и серверы могут кэшировать часто используемые данные для повышения скорости связи.
Нейтральность языка и базы данных
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 возможно без полной перезаписи.
Ниже приводится описание процесса.
- Изучите модель данных API RESTful. Для этого исследуйте форму данных в каждом ресурсе URL.
- Напишите схему GraphQL из модели данных.
- Определите, какие операции клиенты выполняют с данными, и включите их в схему.
- Создайте функцию преобразователя в серверном коде для каждого поля схемы.
- Создайте сервер GraphQL с преобразователями и схемой.
После этого клиенты могут взаимодействовать с вашим API с помощью GraphQL или REST.
Краткое описание различий 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, создав аккаунт сегодня.