Зачем нужны запросы самоанализа в GraphQL?
Development | Комментировать запись
Как известно, система типизации GraphQL отличается своей строгостью, благодаря чему GraphQL может поддерживать систему самоанализа (или интроспекции). Интроспекция GraphQL – это встроенная возможность обнаруживать ресурсы, доступные в схеме GraphQL. Проще говоря, с помощью запросов самоанализа вы можете узнать о доступных полях и типах схемы GraphQL. Эта возможность также помогает GraphiQL собирать документацию о схеме и поддерживает автозаполнение. Система интроспекции имеет множество применений, некоторые из них мы рассмотрим ниже.
Итак, в данном мануале мы поговорим о запросах самоанализа GraphiQL. Для выполнения примеров мы воспользуемся конечной точкой публичного SWAPI API от Star Wars.
Запросы __type
Сначала давайте запустим встроенный запрос __type, с помощью которого мы узнаем тип Film:
query FilmType {
__type(name: "Film") {
kind
name
fields {
name
description
type {
name
}
}
}
}
Рассмотрим этот пример подробнее:
- kind предоставляет нам значение enum для типа (например, OBJECT, SCALAR или INTERFACE).
- name определяет имя типа.
- description предоставляет описание.
Ответ на данный запрос будет выглядеть так:
{
"data": {
"__type": {
"kind": "OBJECT",
"name": "Film",
"fields": [
{
"name": "title",
"description": "The title of this film.",
"type": {
"name": "String"
}
},
{
"name": "episodeID",
"description": "The episode number of this film.",
"type": {
"name": "Int"
}
},
...
Обратите внимание на использование встроенного __type: здесь с его помощью мы получаем информацию о типе конкретного объекта или интерфейса.
Давайте взглянем на еще один пример, в котором мы попробуем получить больше информации об определенном типе:
query LearnAboutFilm {
__type(name: "Film") {
...AboutType
}
}
fragment AboutType on __Type {
fields {
name
description
args {
name
description
}
}
interfaces {
name
description
}
inputFields {
name
description
}
possibleTypes {
kind
name
fields {
name
description
type {
kind
name
description
}
}
}
}
Запрос __schema
С помощью запроса __schema мы можем извлечь информацию о самой схеме. Давайте посмотрим на такой пример запроса:
query LearnAboutSchema {
__schema {
types {
name
kind
}
queryType {
fields {
name
description
}
}
}
}
Этот запрос выведет на экран следующий ответ:
{
"data": {
"__schema": {
"types": [
{
"name": "Root",
"kind": "OBJECT"
},
{
"name": "String",
"kind": "SCALAR"
},
{
"name": "Int",
"kind": "SCALAR"
},
...
"queryType": {
"fields": [
{
"name": "allFilms",
"description": null
},
{
"name": "film",
"description": null
},
...
Запрос __typename
Запросы __typename можно использовать как часть обычных запросов, чтобы узнать тип конкретного поля. Например:
query LearnAboutFilm {
allFilms {
films {
__typename
title
}
}
film (id: "ZmlsbXM6Mw==") {
__typename
title
}
starship(id: "c3RhcnNoaXBzOjc1") {
__typename
name
model
}
}
Ответ на данный запрос выглядит следующим образом:
{
"data": {
"allFilms": {
"films": [
{
"__typename": "Film",
"title": "A New Hope"
},
{
"__typename": "Film",
"title": "The Empire Strikes Back"
},
...
]
},
"film": {
"__typename": "Film",
"title": "Return of the Jedi"
},
"starship": {
"__typename": "Starship",
"name": "V-wing",
"model": "Alpha-3 Nimbus-class V-wing starfighter"
}
}
}
Заключение
Как видите, интроспекция в GraphQL позволяет пользователям получить подробное представление о схемах и разобраться с доступными ресурсами. Кроме того, на основе этой системы GraphQL Playground может самостоятельно документировать API, а также выполнять автозаполнение и генерировать код.
Читайте также: Введение в GraphQL: преимущества и недостатки
Tags: GraphQL