使用 GraphQL 进行自省查询

使用GraphQL,您可以运行自检查询,以了解GraphQL模式的可用字段和类型。这种自省能力也是GraphiQL能够提供有关模式和自动完成的文档的原因。

让我们使用Star WarsSWAPI Public API端点对其运行几个自省查询。

__类型

首先,让我们运行一个查询,使用内置的__类型来查询电影类型:

 1query FilmType {
 2  __type(name: "Film") {
 3    kind
 4    name
 5    fields {
 6      name
 7      description
 8      type {
 9        name
10      }
11    }
12  }
13}
  • Kind 为我们提供类型的枚举值,如Object、标量或接口。
  • 名称 为我们提供类型的名称。
  • 描述 ,好吧,给了我们描述!

以下是人们的回应:

 1{
 2  "data": {
 3    "__type": {
 4      "kind": "OBJECT",
 5      "name": "Film",
 6      "fields": [
 7        {
 8          "name": "title",
 9          "description": "The title of this film.",
10          "type": {
11            "name": "String"
12          }
13        },
14        {
15          "name": "episodeID",
16          "description": "The episode number of this film.",
17          "type": {
18            "name": "Int"
19          }
20        },
21        ...

注意,这里使用了内置的__type(类型为__Type)来获取有关特定对象或接口的类型的信息。


下面是使用片段了解特定类型的更多信息的另一个示例:

 1query LearnAboutFilm {
 2  __type(name: "Film") {
 3    ...AboutType
 4  }
 5}
 6
 7fragment AboutType on __Type {
 8  fields {
 9    name
10    description
11    args {
12      name
13      description
14    }
15  }
16  interfaces {
17    name
18    description
19  }
20  inputFields {
21    name
22    description
23  }
24  possibleTypes {
25    kind
26    name
27    fields {
28      name
29      description
30      type {
31        kind
32        name
33        description
34      }
35    }
36  }
37}

__模式

使用__SCHEMA,我们可以向服务器询问有关架构本身的信息。让我们来看一个例子:

 1query LearnAboutSchema {
 2  __schema {
 3    types {
 4      name
 5      kind
 6    }
 7    queryType {
 8      fields {
 9        name
10        description
11      }
12    }
13  }
14}

而他们的回应是:

 1{
 2  "data": {
 3    "__schema": {
 4      "types": [
 5        {
 6          "name": "Root",
 7          "kind": "OBJECT"
 8        },
 9        {
10          "name": "String",
11          "kind": "SCALAR"
12        },
13        {
14          "name": "Int",
15          "kind": "SCALAR"
16        },
17        ...
18        "queryType": {
19        "fields": [
20          {
21            "name": "allFilms",
22            "description": null
23          },
24          {
25            "name": "film",
26            "description": null
27          },
28          ...

__类型

__typeName可以作为常规查询的一部分,用于查询特定字段的类型:

 1query LearnAboutFilm {
 2  allFilms {
 3    films {
 4      __typename
 5      title
 6    }
 7  }
 8  film (id: "ZmlsbXM6Mw==") {
 9    __typename
10    title
11  }
12  starship(id: "c3RhcnNoaXBzOjc1") {
13    __typename
14    name
15    model
16  }
17}

以下是人们的回应:

 1{
 2  "data": {
 3    "allFilms": {
 4      "films": [
 5        {
 6          "__typename": "Film",
 7          "title": "A New Hope"
 8        },
 9        {
10          "__typename": "Film",
11          "title": "The Empire Strikes Back"
12        },
13        ...
14      ]
15    },
16    "film": {
17      "__typename": "Film",
18      "title": "Return of the Jedi"
19    },
20    "starship": {
21      "__typename": "Starship",
22      "name": "V-wing",
23      "model": "Alpha-3 Nimbus-class V-wing starfighter"
24    }
25  }
26}
Published At
Categories with 技术
Tagged with
comments powered by Disqus