GraphQL в действии
1. Что такое GrqphQL
GraphQL — это стиль запросов API, ориентированный на данные.
GraphQL - это ориентированный на данные API-запрос, разработанный Facebook. Клиенту нужно только дать ему описание, а затем GraphQL может собрать данные, соответствующие описанию из базы данных и возврат ее.
2. Какую проблему решает GraphQL
В разработке мы обычно используем RESTful API, ориентированный на ресурсы. Обычно нам нужно несколько ресурсов для отображения страницы.Когда REST API запрашивает несколько ресурсов, будет загружено несколько URL-адресов, и GraphQL может получить все необходимые данные в одном запросе.
Решить болевые точки:
-
Формат данных, возвращаемых интерфейсом, не идеален для вызывающей стороны (внешнего интерфейса).
-
Для нескольких ресурсов используется только один запрос, что снижает нагрузку на сервер.
-
Поля данных контролируются вызывающей стороной
GraphQL — это и язык запросов для API, и среда выполнения, которая удовлетворяет вашим запросам данных. GraphQL предоставляет полное и простое для понимания описание данных в вашем API, позволяя клиентам получать именно те данные, которые им нужны, без какой-либо избыточности, упрощая развитие API с течением времени, и может использоваться для создания мощных инструментов разработчика. .
Пример:
Вот пример домашней страницы Nuggets, которую можно разделить на эти ресурсы (список статей, список категорий, список авторов)
REST API
Список статей/articles
[
{
title: 'xxx',
content: 'xxx内容'
}
]
Список категорий/categories
[
{
id: '1'
name: '前端',
},
{
id: '2'
name: '后端',
},
]
Список рекомендаций авторов/recommendationAuthor
[
{
id: 1,
username: '张三'
}
]
Вышеупомянутое предназначено для использования интерфейса REST для получения данных, необходимых для домашней страницы, и ему необходимо отправить запросы 3. Давайте посмотрим, как выглядит запрос GraphQL?
Интерфейс запроса GraphQL/graphql/query
query getHomePage() {
articleList($first: 0) {
title
content
},
categoryList(){
id
name
},
recommendationAuthorList($limit: 10) {
id
username
},
}
Через Graphql можно получить всю информацию всего одним запросом, а формат возвращаемых данных контролируется вызывающей стороной, ни больше, ни меньше.
3 важные концепции GraphQL
Вот еще несколько важных концепций GraphQL, на которые вы можете ссылатьсяGraphQLСм. документацию на официальном сайте.
3.1 Тип операции
Типом операции может быть запрос, мутация, подстановка, описывающая тип операции, которую вы собираетесь выполнить.
- запрос запрос
- мутация
- подписка на подписку, когда данные будут обновлены, сообщение будет отправлено
Каждый Graphql имеетquery
тип, может также иметьmutation
тип. Они определяют точку входа для каждого запроса Graphql.
3.2 Скалярные типы
- Int
有符号32位整数
- Float
有符号双精度浮点数
- String
UTF-8字符序列
- Boolean
true或者false
- ID
ID标量类型标识一个唯一标识符
3.3 Типы объектов и поля
type Article{
title: String
author: [User]
}
Выше я объявил тип объекта GraphQL, здесь я объявляю два поля и указываю тип поля.
Строка является одним из встроенных скалярных типов и не может быть выбрана в запросах.
[Пользователь] представляет массив пользователей, и каждый элемент массива является объектом пользователя.
-
Как появился объект User?
Использовать как статью
type
объявление ключевого словаtype User { name: String age: Int }
-
Объявите объект, что толку?
При предоставлении внешней записи запроса через Query мы обычно используем объект как единицу. Думайте о каждом объекте как об интерфейсе.
3.3 Тип ввода
Запись об изменении предоставляется извне через Mutation. Иногда вам нужно передать весь объект как новый объект, и предыдущий скалярный тип не может быть удовлетворен.
Пример официального сайта:
4. Яйцо-график бой
Прежде чем клиент сможет его использовать, нам нужно определить структуру схемы на сервере.
4.1 Использование строительных лесов для создания проекта Egg
PS: Если загрузка слишком медленная, вы можете сначала установить скаффолдинг egg-init глобально, а затем выполнитьegg-init --type simple --registry china
Используйте зеркало Taobao для создания проекта
4.2 Установите плагин graphql
-
воплощать в жизнь
npm i egg-apollo-server --save
-
Добавьте соответствующую конфигурацию graphql в проект яйца, см. подробностиegg-apollo-server
вот и не пользовалсяegg-graphqlПлагин используется.egg-apollo-server
PS: config.graphql.subscriptions используется для аутентификации запроса grapql, в этой демонстрации его не нужно менять на false.
4.3 Определение схемы
├── app
│ ├── controller
│ │ └── home.js
│ ├── graphql
│ │ ├── article
│ │ │ ├── resolver.js
│ │ │ └── schema.graphql
│ ├── router.js
│ └── service
├── config
│ ├── config.default.js
│ └── plugin.js
├── package.json
└── package-lock.json
-
schema.graphql
Определение типов и операций GraphQL
extend type Query { articleList(first: ID): [Article] } type Article { id: ID title: String content: String author: Author } type Author { name: String age: Int } extend type Mutation { addArticle(title: String, content: String, author: AddAuthor): Article } input AddArticle { title: String content: String } input AddAuthor { name: String age: Int }
-
resolver.js
реализовать операцию
'use strict'; const list = [ { id: 1, content: 'aaa', title: '', author: { name: 'aaa', age: 18, }, }, { id: 2, content: 'bbb', title: '', author: { name: 'aaa', age: 18, }, }, ]; module.exports = { Query: { articleList: () => { return list; }, }, Mutation: { addArticle(root, params, ctx) { console.log(params); params.id = list.length++; list.push(params); return params; }, }, };
4.4 отладка графа
браузер открытhttp://127.0.0.1:7001/graphqlотлаживать
PS: защиту csrf нужно отключить перед тестированием, иначе post запрос, отправленный отладкой, будет перехвачен
Левая сторона — это область запроса, где написан оператор операции. Справа результат выполнения.
Отладка запросов
{
articleList(first: 0){
id
title
content
author{
name
age
}
}
}
Изменить отладку
mutation {
addArticle(title: "title", content: "content", author: {name: "张三", age: 15}){
title
content
id
}
}