追赶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