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
16
17
18
19
20
  empireHero: hero(episode: EMPIRE) {

name

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

name

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

```

## Fragments

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

{
leftComparison: hero(episode: EMPIRE) {

...comparisonFields

}
rightComparison: hero(episode: JEDI) {

...comparisonFields

}
}

fragment comparisonFields on Character {
name
appearsIn
friends {

name

}
}

1
2
3
4

## Operation Name

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

query HeroNameAndFriends {
hero {

name

friends {
  name
}

}
}

1
2
3
4
5
6

## Variables

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

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

{“graphiql”: true, “variables”: { “episode”: JEDI} }

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

name

friends {
  name
}

}
}

1
2
3
4

### Variable Definitions

例如上方的例子中:

query HeroNameAndFriends($episode: Episode)

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

1
2

也可以给默认值:

query HeroNameAndFriends($episode: Episode = “JEDI”)

1
2

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

query Hero($withFriends: Boolean!)

1
2
3
4

### Directives 指令

类似于环绕条件:

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

name

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

}
}

1
2
3
4

## Mutation

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

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

stars
commentary

}
}

1
2
3
4

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

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

{
“ep”: “JEDI”,
“review”: {

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

}
}

1
2

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

{
“data”: {

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

}
}

1
2

## Types

type Character {
name: String!

注意 name 仅仅是这个 type 的 attr, attr 的名字可以随意, 除了下方提到的两个特殊关键字

appearsIn: [Episode]!

方括号代表这个东西是一个数组

}

1
2


type Starship {
id: ID!
name: String!
length(unit: LengthUnit = METER): Float

这里使用了一些参数, 这个参数的名字叫做 unit, 并且类型是 LengthUnit, 并且默认值是 METER

}

1
2

### 特定的关键字

schema {
query: Query
mutation: Mutation
}

1
2
3
4
5
6
7

在查询的时候:

* query 必须提供
* mutation 可选

### 枚举

enum Episode {
NEWHOPE
EMPIRE
JEDI
}