Что такое самоанализ в GraphQL
GraphQL выделяется своей сильной системой типов. Благодаря системе строгой типизации GraphQL может предоставить систему самоанализа для запроса схемы. Система самоанализа в GraphQL предоставляет клиентам возможность обнаруживать ресурсы, доступные в схеме GraphQL. Система самоанализа — перо в шляпе GraphQL. У него много применений, и мы увидим некоторые из них ниже.
Почему самоанализ полезен?
Предоставляет клиентам полное представление о схеме
С помощью запросов самоанализа клиент может получить полное представление о ресурсах в схеме GraphQL. Это может сэкономить клиенту кучу времени на просмотр документации. Вместо этого они могут проанализировать схему и глубже понять доступные им ресурсы.
Создавайте потрясающие инструменты
Система самоанализа позволяет сообществу создавать потрясающие инструменты для GraphQL. Некоторые из инструментов, которые мы используем сегодня и обязаны своим существованием системе самоанализа, — это GraphiQL, GraphQL Playground и другие. Эти инструменты помогают клиентам изучать схему GraphQL простым и интерактивным способом.
Самостоятельная документация
Эти инструменты GraphQL, такие как GraphQL Playground, используют систему самоанализа для предоставления таких функций, как самостоятельное документирование API, автоматическое завершение и генерация кода.
Запросы самоанализа
Давайте погрузимся в некоторые запросы самоанализа и научимся их писать.
Чтобы продемонстрировать и изучить запросы самоанализа GraphQL, я собираюсь использовать общедоступный API GitHub. Вы можете продолжить, открыв https://developer.github.com/v4/explorer/. Убедитесь, что вы вошли в свою учетную запись GitHub, чтобы выполнять запросы самоанализа.
В проводнике GitHub GraphQL мы можем начать вводить наши запросы с левой стороны и нажать кнопку воспроизведения, чтобы увидеть ответ JSON с правой стороны. Мы также можем просмотреть документацию по API с правой стороны.
Тип схемы запроса
Все поля в системе самоанализа имеют префикс с двумя символами подчеркивания. Давайте запросим поле __schema и узнаем о типах, поддерживаемых в схеме.
query getSchmemaTypes {
__schema {
types {
name
}
}
}
Ответ JSON на этот запрос довольно длинный из схемы GitHub, ниже приведен снимок ответа.
{
"data": {
"__schema": {
"types": [
{
"name": "AcceptEnterpriseAdministratorInvitationInput"
},
{
"name": "AcceptEnterpriseAdministratorInvitationPayload"
},
{
"name": "AcceptTopicSuggestionInput"
},
{
"name": "AcceptTopicSuggestionPayload"
}
......
]
}
}
}
Поддерживаемые запросы запросы и мутации
Используя самоанализ, мы также можем получить поддерживаемые запросы и мутации из схемы. Вы также можете использовать поле isDeprecated, чтобы узнать, устарели ли определенные запросы/мутации. Это будет полезной информацией для клиента перед использованием API. В поле __schema запросите queryType и mutationType.
query getSupportedQueries {
__schema {
queryType {
fields{
name
}
}
}
}
Ответ JSON ниже показывает запросы, поддерживаемые API.
{
"data": {
"__schema": {
"queryType": {
"fields": [
{
"name": "codeOfConduct"
},
{
"name": "codesOfConduct"
},
{
"name": "enterprise"
},
{
"name": "enterpriseAdministratorInvitation"
},
{
"name": "enterpriseAdministratorInvitationByToken"
},
{
"name": "license"
},
{
"name": "licenses"
},
{
"name": "marketplaceCategories"
},
{
"name": "marketplaceCategory"
},
{
"name": "marketplaceListing"
},
{
"name": "marketplaceListings"
},
{
"name": "meta"
},
{
"name": "node"
},
{
"name": "nodes"
},
{
"name": "organization"
},
{
"name": "rateLimit"
},
{
"name": "relay"
},
{
"name": "repository"
},
{
"name": "repositoryOwner"
},
.....
}
}
}
}
Типы свойств запроса
Следующий запрос самоанализа, который мы собираемся написать, — это запрос поля __type. При запросе типов нам нужно предоставить имя типа, который мы запрашиваем. Я выбрал один из типов, RepositoryOwner, возвращенный из нашего предыдущего запроса. В приведенном ниже запросе мы ищем описание и название всех полей для типа RepositoryOwner.
query getRepositoryOwnerType {
__type(name:"RepositoryOwner") {
description
fields {
name
}
}
}
Вот ответ JSON. Вы можете увидеть все поля, которые являются частью типа RepositoryOwner.
{
"data": {
"__type": {
"description": "Represents an owner of a Repository.",
"fields": [
{
"name": "avatarUrl"
},
{
"name": "id"
},
{
"name": "login"
},
{
"name": "repositories"
},
{
"name": "repository"
},
{
"name": "resourcePath"
},
{
"name": "url"
}
]
}
}
}
Директивы запроса
Из __schema мы также можем запросить директивы, поддерживаемые схемой GraphQL.
query getDirectives {
__schema {
directives {
name
description
}
}
}
Ответ JSON показывает, что схема GitHub поддерживает три директивы: include, skip и deprecated.
{
"data": {
"__schema": {
"directives": [
{
"name": "include",
"description": "Directs the executor to include this field or fragment only when the `if` argument is true."
},
{
"name": "skip",
"description": "Directs the executor to skip this field or fragment when the `if` argument is true."
},
{
"name": "deprecated",
"description": "Marks an element of a GraphQL schema as no longer supported."
}
]
}
}
}
Вывод
Надеюсь, вам понравилось изучение системы самоанализа GraphQL. Если вы заинтересованы в дальнейшем изучении GraphQL, вы можете ознакомиться с моими курсами по GraphQL на Pluralsight:
Другие ресурсы:
Надеюсь, вам понравилась эта статья. Увидимся снова с новыми статьями. Если вам понравился этот пост, не забудьте поделиться им со своей сетью. Вы можете подписаться на меня в твиттере @AdhithiRavi, чтобы получать больше обновлений или если у вас есть какие-либо вопросы.
Эта история изначально была опубликована на https://programmingwithmosh.com/