Этот пост блога является частью учебника для новичков. Следуй за мной, чтобы получить больше.
С теоретическим введением из предыдущего поста на GraphQL мы можем перейти к описанию неотъемлемой части этого стандарта, а именно системы типа, которая позволяет определить схему API – язык определения схемы GraphQL (SDL). Это специальный синтаксис, который был очень хорошо документирован и создан таким образом, что вы можете работать с ним независимо от языка или структуры.
Тип Система
GraphQL сильно набирается, что означает, что каждое определение должно иметь определенный тип. Система типа поставляется с помощью, которая обеспечивает несколько возможностей для определения элементов нашего API. Давайте подумаем о библиотечной заявке (книги и авторам) объявить первые типы нашего API. Нажмите на изображение, чтобы перейти к образцу книг.
Наиболее важным и наиболее часто используемым элементом всей головоломки является тип объекта, который в простейших терминах является набор полей. Приведенные выше примеры: два объекта были объявлены с использованием типовой книги {} и типа автор {} определения, в то время как внутри этих объявлений вы можете увидеть поля, которые имеют определенные типы, например, Имя: Строка!, Или Isbookoftheyear: Boolean!.
Скалярные типы
В GraphQL есть несколько встроенных скалярных типов для полевых деклараций:
- Строка – набор символов в формате UTF-8,
- Int – 32-битное целое число,
- Поплавок – номер с плавающей запятой,
- Логическое значение – значение правдой или ложным
- IS – тип, представляющий уникальный идентификатор для объекта, чаще всего используется для перезагрузки (используется кэш). Он сериализован так же, как тип строки.
Интерфейс
Система системы типа GraphQl имеет интерфейсы. Интерфейс открывает определенный набор полей, которые тип должен включать в себя реализацию интерфейса. Например, мы могли бы представлять интерфейс публикации, который подается в качестве книги или журнала. Эти типы имеют общие характеристики, включая название и дату выпуска.
Очень вероятно, что автор мог опубликовать как книги, так и журналы, благодаря интерфейсу вам не нужно становиться зависимым от определенного типа публикации, в этом случае мы можем использовать более массивную абстрацию, которая является публикацией.
Союз
Интересный механизм – тип Union, который позволяет представлять группу объектов, которые не имеют одинаковых полей. Отличным примером является запрос к поисковой системе, которая может искать как название книги, так и имя автора. С этой декларацией вы можете запросить что-то подобное:
union SearchResult = Book | Author
type Query {
search(text: String!): SearchResult
}
query {
search(text: "Park") {
... on Book {
title
}
... on Author {
name
}
}
}
И в результате мы увидим ответ:
{
"data": {
"search": [
{
"name": "Jurassic Park",
},
{
"name": "Jessica Park",
}
]
}
}
Проверьте, как он смотрит на визуальный редактор:
Схема объявления
При определении схемы API имеется два элемента верхнего уровня – запрос и мутация, которые являются обычными объектами, созданными таким же образом, все остальные. Внутри них мы объявляем возможности нашего API. Определение самой схемы тривиально:
schema {
query: Query
mutation: Mutation
}
type Query {
}
type Mutation {
}
Запрос
Запрос является обязательным элементом в схеме и отвечает за чтение API. Все определенные поля внутри этого объекта можно сравнить с различными конечными точками API. Принятый принцип заключается в том, что элементы, выданные по запросу, являются существительными, которые явно указывают объект, который будет загружен – в приведенном выше примере они книга и автор. Чтобы лучше проиллюстрировать целое, вы можете переместить предыдущие определения объектов для запроса.
schema {
query: Query
}
type Query {
book(id: ID!): Book
author(id: ID!): Author
}
type Book {
id: ID!
title: String!
shortDescription: String!
description: String
pages: Int!
isbn: String!
releaseDate: String!
isBookOftheYear: Boolean!
author: Author!
}
type Author {
id: ID!
name: String!
bio: String
sex: String!
books: [Book!]!
}
Аргументы
В некоторых строках вы можете увидеть декларацию полей немного отличаться от, чем в предыдущих случаях (например, книга (ID: String!)) , Где в дополнение к названию поля вы можете увидеть скобки с помощью другой декларации – не более чем вводить аргумент на запрос – на его основе вы можете пройти несколько параметров в соответствии с которыми вы хотите загрузить данные. В приведенном выше примере ожидается, что идентификатор пользователя ожидается, и выполненные запросы будут выглядеть что-то подобное:
query {
book(id: "1234") {
title
isbn
}
}
Мутация
Мутация – это необязательная часть, которая позволяет добавлять, редактировать или удалять элементы в нашем приложении через API. Его определение идентично типу запроса. Единственное отличие – это принцип определения полей – в отличие от запроса в мутации, поля чаще всего называются глаголами, которые четко определяют выполненное действие. Дополнение приведенного выше примера, стоит добавить возможность создания новых книг.
Тип ввода
Прежде чем мы пойдем в пример объявления мутации, стоит представить еще один тип, при обсуждении всех основных типов в разделе, относящийся к системе типа. Чтобы изменить или создавать новые элементы в приложении через GraphQL, был создан конкретный тип ввода, который ведет себя очень похоже на регулярный объект, с тем, чтобы во время ввода декларации используется вместо типа ключевого слова.
schema {
query: Query
mutation: Mutation
}
type Mutation {
createAuthor(input: AuthorInput): Author
updateAuthor(id: ID!, input: AuthorInput): Author
}
input AuthorInput {
name: String!
bio: String
sex: String!
}
В приведенном выше примере вы можете наблюдать, что действия CreateAltor и Updateauthor ожидают, что объект автора Prominput в качестве аргумента и возвращает объект автора. Для заявленной схемы создание новой книги требует подобного действия:
mutation {
createAuthor(input: {
name: String!
bio: String
sex: String!
}) {
id
title
}
}
Если вы ищете лучшие учебники GraphQL, проверьте эту пост Отказ
Оригинал: “https://dev.to/robmatyszewski/graphql-tutorial-for-newbies—schema-definition-7dm”