追赶GraphQL导论

为了开始使用AWS AppSync,首先需要掌握GraphQL,所以我把它写成了一篇文章。

从graphql.org的介绍中,我们挑选出了一些开始学习GraphQL的信息。

未来我们会继续补充不完整的部分。

首先

GraphQL是什么?

    • クエリ言語の言語仕様である

 

    クエリ言語を実行するサーバー側のランタイムも指す

与特定数据存储相结合的技术不相关。

为了开始使用GraphQL。

需要以下要素。

    • データフィールドと型の定義

 

    フィールドに対するデータアクセスの実装
type Query {
  me: User
}

type User {
  id: ID
  name: String
}

数据访问的实现是将上述声明与数据存储绑定在一起。它是独立于GraphQL规范的要素,但是仍然是必需的。

// データアクセスの仮実装
function Query_me(request) {
  return request.auth.user;
}

function User_name(user) {
  return user.getName();
}

尝试从客户端查询名为me的数据,以回应上述的宣言和实施。

查询的表达方式如下。

{
  me {
    name
  }
}

一个来自GraphQL服务的响应示例是以下的json。

{
  "me": {
    "name": "Luke Skywalker"
  }
}

查询和变更

通过查询时请求“所需字段”,GraphQL运行时仅返回所请求的数据。只返回客户端所需的数据。即使是嵌套的数据结构也适用。

争论

用于SQL中类似于where的功能。以下查询中,id为”1000″。

{
  human(id: "1000") {
    name
    height
  }
}

因为在查询中可以以声明性的方式描述参数,所以一眼就能看得很清楚。

此外,不仅仅可以使用 “また”,还可以像应用轻微函数一样完成一些技巧。在以下示例中,针对标量类型字段的“height”,发起请求来进行单位转换并返回。

{
  human(id: "1000") {
    name
    height(unit: FOOT)
  }
}

别名

如果想在多个字段中使用不同的参数发送请求,可以使用这个。
在下面的例子中,获取了两个不同 hero 的参数,并分别给予了 empireHero 和 jediHero 的别名。

{
  empireHero: hero(episode: EMPIRE) {
    name
  }
  jediHero: hero(episode: JEDI) {
    name
  }
}

碎片

当需要一种稍微复杂的数据结构时。

当我看到这个示例的时候,个人感觉它与C语言的内联函数和宏定义非常相似。可以通过在查询中定义一个片段并声明它,来将其展开到相应位置。

在下面的例子中,可以看到通过展开在”comparisionFields”中声明的结构,在请求中进行的方式。

{
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields
  }
}

fragment comparisonFields on Character {
  name
  appearsIn
  friends {
    name
  }
}

返回的字段是leftComparison和rightComparison。每个字段的内容取决于…comparisionFields的展开形式,即fragment comparisonFields的声明内容。

{
  "data": {
    "leftComparison": {
      "name": "Luke Skywalker",
      "appearsIn": [
        "NEWHOPE",
        "EMPIRE",
        "JEDI"
      ],
      "friends": [
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        },
        {
          "name": "C-3PO"
        },
        {
          "name": "R2-D2"
        }
      ]
    },
    "rightComparison": {
      "name": "R2-D2",
      "appearsIn": [
        "NEWHOPE",
        "EMPIRE",
        "JEDI"
      ],
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

操作名称

作为其名字所示,用于声明所意图的“操作”。它包括查询(query)、变更(mutation)和订阅(subscription)三种类型。

关于查询,可以使用省略记法。到目前为止的示例正是这种情况,它们都隐含地使用了查询。

query HeroNameAndFriends {
  hero {
    name
    friends {
      name
    }
  }
}

如果要描述涵盖多个操作的查询,则是必需的。然而,出于服务器端日志记录的角度考虑,明确地将“操作”包含在查询中是有用的,因此建议指定。

变量

(待进一步补充)

指令

(将会追加记录)

突变 (tū

(待更新)

内联片段

(待补充)

请参考

    • graphql.org – Introduction to GraphQL

 

    GraphQL入門 – 使いたくなるGraphQL
广告
将在 10 秒后关闭
bannerAds