📜  GraphQL |询问

📅  最后修改于: 2022-05-13 01:56:22.093000             🧑  作者: Mango

GraphQL |询问

我们将使用 GraphQL API 进行演示。 GraphQL 是一种用于 API 的开源数据查询和操作语言,也是一种使用现有数据完成查询的运行时。它既不是架构模式也不是 Web 服务。 GraphQL 于 2012 年由 Facebook 内部开发,然后于 2015 年公开发布。

术语:让我们从定义基本术语开始。作为参考,请考虑以下示例操作。
首次介绍

GraphQL 操作:作为基本定义,访问服务器的任何内容都称为“查询”。但形式上, Operations有三种类型, Query只是其中一种,另外两种是MutationsSubscriptions 。一个字符串是用 GraphQL 语言编写的,它定义了一个或多个操作和片段。我们将在本文中使用 Pokemon 模式的现成示例,您也可以创建自己的模式。

GraphQL 查询: GraphQL 查询用于读取或获取值。它被交给 GraphQL 服务器执行并返回结果。

  • 字段:将作为查询响应的一部分返回的数据单元称为字段,即使它们是嵌套的。查询结构和该查询结构的结果将与您在下图中看到的相同。
    询问:
    {
      pokemon(name:"pikachu") {
        name
        id
        types
      }
    }

    输出:

  • 参数:参数有助于以特定方式解决服务器端的查询。它是与字段一起提供的键:值对。它可以是字面量或变量,在我们已经通过提供特定名称在 pokemon 上使用参数的字段示例中。
    询问:
    {
      pokemon(id:"UG9rZW1vbjowMDE") {
        name
        types
      }
    }

    输出:

  • 别名:如果要对同一字段进行两个单独的查询,我们可以使用“别名”来区分这两个查询。这些别名像前缀一样添加到查询中。例如,如果我们想要检索两个 pokemon 并将它们命名为'firstPokemon''secondPPokemon'

    询问:

    query retrievePokemon{
      firstPokemon: pokemon(name:"Pikachu") {
        id
        types
      }
      secondPokemon: pokemon(name:"Charizard") {
        id
        types
      }
    }

    输出:

  • 片段: GraphQL 提供了创建查询字段的子类型的能力,可以使用附加到它的标识符来一次又一次地使用。它被称为片段,并以...fragmentName的形式提供。获取多个对象,每个对象可能具有不同的字段
    句法:
    fragment basicInfoOfPokemon on Pokemon {
      name
      id
    }
    
    query retrievePokemon {
      firstPokemon: pokemon(name: "pikachu") {
        ...basicInfoOfPokemon
        types
        weight{
          minimum
          maximum
        }
        classification
      }
    }

    输出:

  • 操作名称:到目前为止我们使用的是简写语法,我们也可以省略查询关键字和名称。在此示例中,我们添加了查询关键字作为操作类型,并添加了Electrictype作为操作名称。
    句法:
    query Electrictype {
      pokemon(name: "pikachu") {
        name
        weight {
          minimum
          maximum
        }
      }
    }

    输出:

  • 指令: “指令”影响返回的结果。常见的是“跳过”“包含”与“如果”相结合。

    @skip:如果您想在特定的“if”条件下“跳过”特定字段,可以使用。
    句法:

    fieldName @skip (if: booleanCondition) {
      name
    }
    # The @skip acts like a default inclusion of 
    # The field, unless the 'if' is valid.

    输出:

    @include如果您想在特定的“if”条件下“包含”特定字段,您可以使用。
    句法:

    fieldName @include (if: booleanCondition) {
      name
    }
    # The @include acts like a default exclusion of 
    # The field, unless the 'if' is valid.
    

    输出: