GraphQL - Getting started
文章目录

GraphQL: Getting started

Fields

  • 输出的格式会按照输入的格式返回

输入格式:

1
2
3
4
5
{
hero {
name
}
}

返回格式:

1
2
3
4
5
6
7
{
"data": {
"hero": {
"name": "R2-D2"
}
}
}

输入格式:

1
2
3
4
5
6
7
8
9
{
hero {
name
# Queries can have comments!
friends {
name
}
}
}

返回格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}

Arguments

就是给不同的 field 添加各种不同的条件.

1
2
3
4
5
6
7
{
human(id: "1000") {
name
height(unit: FOOT)
# 这里用的是枚举的值
}
}

Alias

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  empireHero: hero(episode: EMPIRE) {

name

}
# 这段查询查询的是 hero 表里面拥有 episode = EMPIRE 的数据
jediHero: hero(episode: JEDI) {

name

}
# 这段查询查询的也是 hero
# 如果不添加别名返回两个拥有相同名称的 key
}

Fragments

这个实际上就是一些可以复用的块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

{
leftComparison: hero(episode: EMPIRE) {

...comparisonFields

}
rightComparison: hero(episode: JEDI) {

...comparisonFields

}
}

fragment comparisonFields on Character {
name
appearsIn
friends {

name

}
}

Operation Name

上方 query 用的都是简化版, 其实 防止歧义 以及 方便调试 应该使用 query 操作符:

1
2
3
4
5
6
7
8
9
10
11
12

query HeroNameAndFriends {
hero {

name

friends {
name
}
}
}

Variables

使用动态语句拼成 query string 不是一个好方法

这也可以使用变量来进行解决,这样从客户端就只需要传进来一个值

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# {"graphiql": true, "variables": { "episode": JEDI} }

query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {

name

friends {
name
}
}
}

Variable Definitions

例如上方的例子中:

1
2
3
4
5

query HeroNameAndFriends($episode: Episode)

# 这里限定了变量名称为 $episode 并且类型为 Episode

也可以给默认值:

1
2
3

query HeroNameAndFriends($episode: Episode = "JEDI")

也可以限定这个值为必须提供:

1
2
3

query Hero($withFriends: Boolean!)

Directives 指令

类似于环绕条件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

query Hero($episode: Episode, $withFriends: Boolean!) {
hero(episode: $episode) {

name

friends @include(if: $withFriends) {
# 上传进来的变量可以到这个地方使用
# 使用 @include 的情况, 除非后面条件为真否则当前 field 无效
name
}
}
}

Mutation

一个非常重要的 Hint, Mutation 是串行执行, 而普通 **query 是并行执行 **

1
2
3
4
5
6
7
8
9
10

mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {

stars
commentary

}
}

Mutation 就类似于我们希望根据客户端发出的内容进行修改返回的内容

比如说去上方的 Mutation 我们提供:

1
2
3
4
5
6
7
8
9
10
11

{
"ep": "JEDI",
"review": {

"stars": 5,
"commentary": "This is a great movie!"

}
}

最终返回的就是这样的值:

1
2
3
4
5
6
7
8
9
10
11
12

{
"data": {

"createReview": {
"stars": 5,
"commentary": "This is a great movie!"
}

}
}

Types

1
2
3
4
5
6
7
8

type Character {
name: String!
# 注意 name 仅仅是这个 type 的 attr, attr 的名字可以随意, 除了下方提到的两个特殊关键字
appearsIn: [Episode]!
# 方括号代表这个东西是一个数组
}

1
2
3
4
5
6
7
8

type Starship {
id: ID!
name: String!
length(unit: LengthUnit = METER): Float
# 这里使用了一些参数, 这个参数的名字叫做 unit, 并且类型是 LengthUnit, 并且默认值是 METER
}

特定的关键字

1
2
3
4
5
6

schema {
query: Query
mutation: Mutation
}

在查询的时候:

  • query 必须提供
  • mutation 可选

枚举

1
2
3
4
5
6

enum Episode {
NEWHOPE
EMPIRE
JEDI
}