Сравнение GraphQL и REST API

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

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

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

Давайте начнем с представления двух.

ОТДЫХА API

REST (передача репрезентативного состояния) — это стиль архитектуры программного обеспечения, описывающий единый интерфейс, который две системы могут использовать для обмена информацией.

Для нас необходимо знать, что API REST имеют четыре характеристики:

  • Единый интерфейс. Сервер отправляет информацию в стандартном формате, таком как JSON. Однако информация может храниться в другом формате.
  • Без гражданства. Клиенты могут запрашивать данные в любом порядке, и каждый запрос не зависит друг от друга.
  • Многоуровневая система — позволяет клиентам подключаться к авторизованным посредникам между клиентом и сервером, например к другим серверам.
  • Кэшируемость — позволяет сохранять некоторые данные на клиенте для повышения производительности.

ГрафQL

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

Мы можем разбить его на двойственную природу GraphQL:

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

Некоторые другие характеристики GraphQL включают в себя:

  • Запрос определенных данных одним вызовом
  • GraphQL использует типы, чтобы клиенты «запрашивали только то, что возможно, и предоставляли четкие и полезные ошибки».

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

Хотя и GraphQl, и REST обеспечивают доступ к данным, способы их обработки значительно различаются, особенно в двух измерениях:

  1. Конкретность
  2. Использование типов

Эти размеры создают некоторые последовательные преимущества и недостатки.

1) Специфика

Специфичность — это первое ключевое различие между GraphQL и REST API.

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

Это приводит к нескольким преимуществам:

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

С другой стороны, API REST более просты.

Однако простота REST API достигается за счет использования фиксированного набора конечных точек, которые возвращают предопределенные структуры данных, что приводит к избыточной и недостаточной выборке.

В некоторых случаях API REST требуют водопадных запросов.

ОТДЫХ Пример

Допустим, вы хотите программно проверить одну из моих статей на Medium. С REST API (в зависимости от его структуры) вам может понадобиться

  1. Выполните один HTTP-запрос, чтобы получить данные автора, которые могут возвращать идентификаторы статей авторов.
  2. Выполните второй HTTP-запрос, чтобы получить определенный идентификатор статьи.

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

Только после того, как вы получите первый ответ, вы можете сделать второй запрос на получение статей автора, используя эту информацию.

// First call to users endpoint gets users data including articles id 
GET /users/123 

// Second call to articles endpoint gets the specific user's article
GET /articles/xwz 

Пример GraphQL

Следуя тому же примеру, ключевое слово query используется для указания того, что клиент запрашивает данные с сервера.

Поле user указывает, к какому ресурсу клиент хочет получить доступ, а аргумент id используется для указания идентификатора пользователя, которого клиент хочет получить.

Поле user также включает в себя набор подполей, которые указывают конкретные данные, которые клиент хочет получить для пользователя. В этом случае клиент запрашивает идентификатор пользователя и статьи.

query {
  user(id: "123") {
    id
    article {
      id
      title
    }
  }
}

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

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

2) Использование типов

Второе ключевое различие между GraphQL и REST API — использование типов.

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

Это может помочь предотвратить ошибки и упростить работу с API.

Пример GraphQL

Ниже приведен типичный пример, в котором тип UserType определяет структуру данных, представляющую пользователя в системе.

Все поля id, name, email и age связаны с определенными типами, ID, String, String и Numberсоответственно. Символ ! указывает на то, что эти поля являются обязательными и не могут быть пустыми.

type UserType {
  id: ID!
  name: String!
  email: String!
  age: Number!
}

type Query {
  user(id: ID!): UserType
}

REST API и схема JSON

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

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

Хороший обходной путь для REST API — схема JSON.

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

Однако схема JSON не является встроенной функцией REST, и не все API REST будут ее использовать.

Подведение итогов GraphQL и REST API

Кто использует GraphQL?

Хотя Facebook в основном занимался определением GraphQL и эталонной реализацией JavaScript, другие известные компании также используют его и вносят в него свой вклад. GraphQL теперь является проектом с открытым исходным кодом.

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

В то время как экосистема GraphQL растет, нет четкой границы между последователями и неиспользователями.

Похоже, это указывает на то, что GraphQL может одинаково хорошо работать в разных отраслях.

Выводы

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

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

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