查询和变更

你可以在本页学到有关如何查询 GraphQL 服务器的详细信息。

内联片段(Inline Fragments)

跟许多类型系统一样,GraphQL schema 也具备定义接口和联合类型的能力。在 schema 指南中可了解更多。

如果你查询的字段返回的是接口或者联合类型,那么你可能需要使用内联片段来取出下层具体类型的数据:

  1. # { "graphiql": true, "variables": { "ep": "JEDI" } }
  2. query HeroForEpisode($ep: Episode!) {
  3. hero(episode: $ep) {
  4. name
  5. ... on Droid {
  6. primaryFunction
  7. }
  8. ... on Human {
  9. height
  10. }
  11. }
  12. }

这个查询中,hero 字段返回 Character 类型,取决于 episode 参数,其可能是 Human 或者 Droid 类型。在直接选择的情况下,你只能请求 Character 上存在的字段,譬如 name

如果要请求具体类型上的字段,你需要使用一个类型条件内联片段。因为第一个片段标注为 … on DroidprimaryFunction 仅在 hero 返回的 CharacterDroid 类型时才会执行。同理适用于 Human 类型的 height 字段。

具名片段也可以用于同样的情况,因为具名片段总是附带了一个类型。

元字段(Meta fields)

某些情况下,你并不知道你将从 GraphQL 服务获得什么类型,这时候你就需要一些方法在客户端来决定如何处理这些数据。GraphQL 允许你在查询的任何位置请求 __typename,一个元字段,以获得那个位置的对象类型名称。

  1. # { "graphiql": true}
  2. {
  3. search(text: "an") {
  4. __typename
  5. ... on Human {
  6. name
  7. }
  8. ... on Droid {
  9. name
  10. }
  11. ... on Starship {
  12. name
  13. }
  14. }
  15. }

上面的查询中,search 返回了一个联合类型,其可能是三种选项之一。没有 __typename 字段的情况下,几乎不可能在客户端分辨开这三个不同的类型。

GraphQL 服务提供了不少元字段,剩下的部分用于描述 内省 系统。