GraphQL是一个用于API的查询语言.
一个GraphQL服务是通过定义类型和类型上的字段来创建,然后给每个类型上的每个字段提供解析函数.
基本用法:1
2
3
4
5
6
7
8type Query {
me: User
}
type User {
id: ID
name: String
}
每个类型上字段的解析函数1
2
3
4
5
6
7function Query_me(request) {
return request.auth.user;
}
function User_name(user) {
return user.getName();
}
一个GraphQL服务运行起来(通常在web服务的一个URL上),它就能接收GraphQL查询,并验证和执行.查询会检查确保只会引用已经定义的类型和字段,然后运行指定的解析函数来生成结果
1 | { |
会返回一个JSON结果1
2
3
4
5{
"me": {
"name": "hhh"
}
}
字段也能指代对象类型(Object).对这个对象的字段进行次级选择(Sub-selection).遍历相关对象及其字段,使得客户端可以一次请求查询大量相关数据.
1 | { |
返回结果: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 | { |
别名:
通过设置别名可以通过不同参数查询相同字段1
2
3
4
5
6
7
8{
empireHero: hero(episode: EMPIRE) {
name
}
jediHero: hero(episode: JEDI) {
name
}
}
1 | { |