GraphQL: гибкий язык запросов и среда выполнения для вашего веб-API

Приложения в Интернете используют API (интерфейсы прикладного программирования) для обмена и обработки данных. Если вы хотите, чтобы другие сервисы могли получать доступ к данным из вашего веб-проекта, вам необходимо разработать и реализовать интерфейс, подобный этому. Существуют некоторые установленные стандарты, такие как SOAP или REST, которые обеспечивают базовую структуру для вашего API. Ими легко управлять с помощью любого распространенного языка программирования — особенно последняя архитектура за последние годы превратилась в полноценное решение премиум-класса благодаря своей простоте.  

Но даже несмотря на впечатляющий успех архитектуры REST, существуют интересные альтернативы, такие как GraphQL, которые обладают не меньшими возможностями. Язык запросов и среда выполнения от компании Facebook, безусловно, может идти в ногу с SOAP и REST, хотя его преимущества проявляются, в частности, при выполнении более сложных запросов.  

Что такое GraphQL?

GraphQL — это SQL-подобный язык запросов, включающий среду выполнения и систему типов, разработанный компанией Facebook в 2012 году. Первоначально он предназначался исключительно для внутреннего использования. Предпосылкой послужил редизайн собственных мобильных приложений Facebook для iOS и Android, которые демонстрировали все более слабую производительность из-за возрастающей сложности. Особенно для доставки данных новостной ленты крупной корпорации необходимо было найти адекватное решение, в котором соотношение между получаемой информацией и необходимыми запросами к серверу было бы удовлетворительным. В 2015 году Facebook выложил исходный код GraphQL в свободный доступ — к тому времени он уже отрегулировал практически весь доступ к данным для мобильных приложений. С 2017 года проект работает под свободной лицензией OWFa 1.0 (Open Web Foundation).  

Как работает GraphQL

Чтобы понять, как работает GraphQL, необходимо разобраться с тремя элементарными компонентами, которые характеризуют проект с открытым исходным кодом:  

  • Язык запросов: Прежде всего, концепция GraphQL описывает язык запросов, который позволяет программам получить несложный доступ к API. В то время как другие архитектуры интерфейсов допускают только очень строгие запросы, которые часто позволяют получить доступ только к одному ресурсу, запросы GraphQL характеризуются высокой степенью гибкости. Это проявляется в том, что количество запрашиваемых ресурсов не ограничено и можно конкретно определить, какие поля данных должны быть запрошены. GraphQL позволяет как читать, так и писать или изменять запросы.  
  • Система типов: GraphQL также работает с собственной системой типов, которая позволяет описывать API с помощью типов данных. Структуры данных, которые определяются таким образом, затем создают фактическую основу для запросов. Каждый тип состоит из одного или нескольких полей, которые, в свою очередь, содержат свои собственные спецификации типов. Созданная таким образом индивидуальная система служит GraphQL в качестве точки отсчета для проверки запросов и отклонения некорректных запросов. 
  • Среда выполнения: Наконец, GraphQL также предоставляет различные серверные среды выполнения для выполнения запросов GraphQL. Для этого доступны библиотеки для различных языков программирования — например, Go, Java, JavaScript, PHP, Python и Ruby. Таким образом, у вас практически свободный выбор языка вашего персонального GraphQL API. Однако среда выполнения отвечает исключительно за преобразование (синтаксический разбор) и проверку запросов, а также за сериализацию ответов (преобразование объектов в соответствующую последовательность байт). Сохранение и определение данных (например, в базе данных) относится к области задач вашего веб-приложения. 

Взаимодействие языка запросов, системы типов и среды выполнения обеспечивает высокую конвертируемость API. Она не только доступна для различных платформ и приложений, но и может быть идеально адаптирована к характеристикам вашего веб-приложения. Это означает, что вы можете легко интегрировать интерфейс GraphQL в код вашего проекта — независимо от того, используете ли вы Python-фреймворк Django, Ruby-фреймворк Rails или JavaScript-фреймворк Node.js.  

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

Что отличает GraphQL?

Одной из главных особенностей GraphQL является простота языка запросов, что максимально облегчает разработчикам доступ к интерфейсу. Тот, кто знаком с GraphQL, например, быстро поймет, что получаемые ответы полностью повторяют заданные вопросы. Формат вывода — это JavaScript-формат JSON (JavaScript Object Notation). Следовательно, отправка точно соответствующего запроса не является большой проблемой, если вы знаете структуру данных, которые нужны вашему приложению, и сформулируете их в запросе. Помимо простого создания запросов, GraphQL обладает следующими свойствами:  

  • Иерархическая структура: Наборы данных, доступ к которым можно получить через API GraphQL, имеют иерархическую структуру. Связи между отдельными объектами могут создаваться автоматически; на их основе можно сформулировать (и ответить) даже на сложные запросы в одном запросе. Обмен несколькими сообщениями между сервером и клиентом (также называемый «обход») не требуется. Такая иерархия данных особенно подходит для граф-ориентированных баз данных, таких как JanusGraph, и для пользовательских интерфейсов, которые обычно также структурированы иерархически.  
  • Сильная типизация: Каждый уровень запроса GraphQL соответствует определенному типу, причем каждый тип описывает набор доступных полей. Однако эта система типов может более чем автоматически определять, правильно или нет сформулирован запрос. Как и SQL, GraphQL может отображать описательные сообщения об ошибках во время разработки или перед отправкой запроса, благодаря строгой типизации.  
  • Гибкость: GraphQL позволяет создавать гибкие запросы. Это также дает вам хорошую свободу и преимущества при разработке или адаптации интерфейса. Как правило, на стороне сервера необходимо внести лишь несколько корректировок, при этом команда разработчиков может действовать совершенно независимо от команды, отвечающей за клиентский компонент. Кроме того, любые изменения или расширения API могут быть сделаны без версионности, так как дополнительные поля могут быть добавлены легко и без влияния на существующих клиентов. 

GraphQL vs. REST — в чем разница между двумя концепциями API?

Уже упоминался большой успех REST во всемирной паутине, а также тот факт, что GraphQL является серьезной альтернативой этой устоявшейся архитектуре веб-сервисов, основанной на HTTP и ориентированной на ресурсы. Это стало возможным благодаря развитию, которое заставило Facebook в первую очередь разработать GraphQL: растущая важность и сложность мобильных веб-приложений. Особенно в приложениях для Android, iOS и т.д. становится очевидной сильная сторона GraphQL как основы API: можно получить доступ ко всем желаемым данным с помощью одного запроса.  

Экземпляр сервера GraphQL предоставляет именно ту информацию, которая определена в запросе, так что через интерфейс не передается ни больше, ни меньше данных, чем требуется. При использовании аналогичных REST API можно каждый раз запрашивать только один конкретный набор данных, где он полностью отображается. При прямом сравнении «GraphQL vs. REST» концепция запросов Facebook оказывается гораздо более точной и эффективной, что положительно сказывается на производительности вашего приложения. В свою очередь, это особенно выгодно для пользователей мобильных устройств, которые зачастую имеют менее эффективное интернет-соединение.  

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

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

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

Учебник по GraphQL: начало работы и пример GraphQL

GraphQL дает вам свободу выбора базового языка программирования благодаря широкому спектру готовых к использованию библиотек. Это также является одним из больших преимуществ при внедрении интерфейса GraphQL в ваше приложение. Например, будучи поклонником Python, вы можете обратиться к библиотеке Graphene — или работать с библиотекой graphql-java|github.com: graphql-java, если ваш проект основан на Java. Если ваше веб-приложение основано на среде выполнения JavaScript Node.js, GraphQL.js подойдет в качестве основы для реализации.  

Примечание .

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

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

Шаг 1: установка библиотеки

Чтобы использовать библиотеки GraphQL, необходимо сначала установить их. Для JavaScript-библиотеки GraphQL.js следует использовать менеджер пакетов JavaScript npm (Node Package Manager) и следующую команду:  

npm install --save graphql 

Кроме того, вы можете получить библиотеку из менеджера пакетов и зависимостей Yarn, разработанного Facebook (в основном) и Google:  

yarn add graphql 

В обоих случаях должна быть установлена актуальная версия Node.js (рекомендуется: Node v6.0.0 или выше).  

Шаг 2: схема первого запроса

Чтобы ваше приложение могло обрабатывать GraphQL-запросы, вам нужна схема, определяющая тип «запрос» и точку доступа к вашему интерфейсу (также называемую корнем API), включая функцию resolver. Для простого образца интерфейса GraphQL, который выводит только сообщение «Hello world», соответствующий код в файле server.js, созданном для этой цели, будет выглядеть следующим образом:  

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

// Build schema based on the GraphQL concept 
var schema = buildSchema(` 
type Query { 
hello: String 
} 
`); 
  
// API root provides a resolver function for each accessing endpoint  
var root = { 
hello: () => { 
return 'Hello world!'; 
}, 
}; 
 
// Execute GraphQL query '{ hello }' and display the corresponding answer graphql(schema, '{ hello }', root).then(response => { 
console.log(response); 
}); 

Теперь выполните этот код с помощью Node.js, введя команду в терминале.

node server.js 

После этого вы должны получить следующее сообщение:  

{ data: { hello: 'Hello world!' } } 

Шаг 3: собственный сервер GraphQL на экспресс-основе

После того как вы создали простой запрос в предыдущем шаге и выполнили его из командной строки, настало время запустить сервер GraphQL API. Это позволит получить доступ к интерфейсу, например, через стандартный веб-браузер. Для этого сначала установите упомянутый выше фреймворк приложений Express и библиотеку express-graphql с помощью следующей команды:  

npm install express express-graphql --save 

Затем измените пример «Hello world!» GraphQL так, чтобы он стал основой вашего GraphQL-сервера, а не простым скриптом. Для этого внедрите модуль Express и используйте библиотеку express-graphql для подключения сервера API к конечной точке HTTP «/graphql»:  

var express = require('express'); 
var graphqlHTTP = require('express-graphql'); 
var { buildSchema } = require('graphql'); 
 
 
// Build schema based on the GraphQL concept 
var schema = buildSchema(` 
type Query { 
hello: String 
} 
`); 
 
// API root provides a resolver function for each accessing endpoint  
var root = { 
hello: () => { 
return 'Hello world!'; 
}, 
}; 
 
var app = express(); 
app.use('/graphql', graphqlHTTP({ 
schema: schema, 
rootValue: root, 
graphiql: true 
})); 
app.listen(4000); 
console.log('Ececute GraphQL API server on localhost:4000/graphql'); 

Как и в предыдущем примере GraphQL, откройте файл server.js с помощью Node.js — с той разницей, что на этот раз вы не выполняете простой запрос, а запускаете свой API-сервер:  

node server.js 

В коде сервера GraphQL Express указывается не только схема и корневой API, но и конечная точка HTTP «/graphql». Запись «graphiql: true» активирует одноименный инструмент, который позволяет вводить запросы через графический интерфейс пользователя. Просто откройте браузер и введите следующий адрес:  

http://localhost:4000/graphql 

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

Более подробную информацию и детальные объяснения по бэкендам и фронтендам GraphQL можно найти в разделе учебников на официальном сайте концепции API Facebook.  

Оцените статью
cdelat.ru
Добавить комментарий