Поиск по сайту:

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


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

Разница в том, кто устанавливает схему

Традиционные API REST включают сервер API, который отвечает на запросы структурированными данными, обычно в форме JSON. Если вы сделаете запрос GET к api.com/users/, вы можете ожидать получить в ответ что-то вроде:

{
  users: [
    {
      name: 'Anthony',
      friends: [...]
    }
  ]
}

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

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

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

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

{
  users(name: "Anthony") {
    email
  }
}

Неважно, содержит ли объект «Пользователь» поля для другой информации; поскольку вы запросили только электронное письмо, вам будет отправлено только электронное письмо. Конечно, вы по-прежнему получаете объект JSON, такой как REST, и вы по-прежнему общаетесь таким же образом, но запросы гораздо более информативны.

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

Кроме того, запросы GraphQL могут быть более эффективными. Например, популярная задача — запрос «друзья друзей». В REST API вам нужно отправить запрос для соответствующего пользователя, а затем, получив идентификаторы его друзей, вы отправляете отдельные запросы на информацию о каждом друге, а затем фильтруете все это для того, что вам нужно. Конечно, вы можете (и должны) реализовать новую конечную точку для выполнения этого запроса на стороне базы данных, но это лишь прикрытие реальной проблемы.

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

{
  users(name: "Anthony") {
    friends {
      name
    }
  }
}

Конечно, GraphQL не лишен недостатков. Для простых приложений слишком сложно заменить базовую конечную точку REST. Кроме того, с традиционным REST API вы получаете возможность разделить разные маршруты. Например, /users и /posts могут обрабатываться отдельными бессерверными функциями Lambda, и с ними можно работать и обновлять их независимо друг от друга. Эта концепция известна как серверная часть микросервисов. Для GraphQL гораздо более централизованно и сложнее (хотя и не невозможно) разделить его на отдельные куски.

Как начать?

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

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

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

var { graphql, buildSchema } = require('graphql');

// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
  type Query {
    hello: String
  }
`);

// The root provides a resolver function for each API endpoint
var root = {
  hello: () => {
    return 'Hello world!';
  },
};

// Run the GraphQL query '{ hello }' and print out the response
graphql(schema, '{ hello }', root).then((response) => {
  console.log(response);
});

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