使用 GraphQL 进行自省查询
使用 GraphQL,您可以运行自省查询来了解 GraphQL 架构的可用字段和类型。这种自省功能也使 GraphiQL 能够提供有关架构和自动完成功能的文档。
让我们使用星球大战SWAPI 公共 API端点来运行一些内省查询。
__类型
首先,让我们使用内置的__类型:
query FilmType {
__type(name: "Film") {
kind
name
fields {
name
description
type {
name
}
}
}
}
- Kind为我们提供类型的枚举值,如 OBJECT、SCALAR 或 INTERFACE。
- 名称给了我们类型的名称。
- 描述,嗯,给了我们描述!
响应内容如下:
{
"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
},
...
__类型名称
__类型名称可以用作常规查询的一部分来查询特定字段的类型:
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"
}
}
}