GraphQL初识

GraphQL是一个用于API的查询语言.

一个GraphQL服务是通过定义类型和类型上的字段来创建,然后给每个类型上的每个字段提供解析函数.

基本用法:

1
2
3
4
5
6
7
8
type Query {
me: User
}

type User {
id: ID
name: String
}

每个类型上字段的解析函数

1
2
3
4
5
6
7
function Query_me(request) {
return request.auth.user;
}

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

一个GraphQL服务运行起来(通常在web服务的一个URL上),它就能接收GraphQL查询,并验证和执行.查询会检查确保只会引用已经定义的类型和字段,然后运行指定的解析函数来生成结果

1
2
3
4
5
{
me{
name
}
}

会返回一个JSON结果

1
2
3
4
5
{
"me": {
"name": "hhh"
}
}

字段也能指代对象类型(Object).对这个对象的字段进行次级选择(Sub-selection).遍历相关对象及其字段,使得客户端可以一次请求查询大量相关数据.

1
2
3
4
5
6
7
8
9
10
{
hero{
name
# 这是注释
# 这里friens指代一个对象类型
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"
}
]
}
}
}

friens返回了一个数组的项目,GraphQL查询会同等看成单个项目或者一个列表项目

传递参数:

1
2
3
4
5
6
7
{
human(id: "1000"){
id
name
height
}
}

返回结果:

1
2
3
4
5
6
7
8
9
{
"data": {
"human": {
"id": "1000",
"name": "Luke Skywalker",
"height": 1.72
}
}
}

每一个字段和嵌套对象都能有自己的一组参数,从而使得GraphQL可以替代多次API请求.
可以给标量(scalar)字段传递参数,用于实现服务端的一次转换

1
2
3
4
5
6
7
{
human(id: "1000"){
name
#传入参数把单位转换为英尺
height(unit: FOOT)
}
}

1
2
3
4
5
6
7
8
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 5.6430448
}
}
}

别名:
通过设置别名可以通过不同参数查询相同字段

1
2
3
4
5
6
7
8
{
empireHero: hero(episode: EMPIRE) {
name
}
jediHero: hero(episode: JEDI) {
name
}
}

1
2
3
4
5
6
7
8
9
10
{
"data": {
"empireHero": {
"name": "Luke Skywalker"
},
"jediHero": {
"name": "R2-D2"
}
}
}