本章节部分内容和案例代码参考自:http://graphql.cn
GraphQL的一个最重要的特性就是查询和结果拥有几乎一样的结构,这样一来前端总能得到想要的数据,而后台服务器也准确地知道前端请求的字段。
在GraphQL中,字段指代一个对象类型(Object)。GraphQL能够遍历相关对象及其字段,使得客户端一次性请求查询大量相关数据,而不必像传统REST架构中那样需要多次
GraphQL query 代码:
{
hero {
name
friends {
name
}
}
}
在这个查询语句中,hero即为一个Object,它包含一个name属性和内嵌了一个friends Object。查询结果即为数据库中所有hero数据对象的name属性和与之相关联的friends数据对象:
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
在GraphQL的query中,还可以使用参数:
{
human(id: "1000") {
name
height(unit: FOOT)
}
}
查询id="1000"的human数据对象,结果包含name和height属性:
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 5.6430448
}
}
}
写过SQL语句的人都知道,在SQL语句中有时候需要使用自嵌套语句,这时候就需要使用别名来区分相同的数据对象。在GraphQL中也提供了这种功能:
empireHero: hero(episode: EMPIRE) {
name
}
jediHero: hero(episode: JEDI) {
name
}
}
在这个query语句中,有两个hero数据对象,但是分别使用别名empireHero和jediHero加以区分:
{
"data": {
"empireHero": {
"name": "Luke Skywalker"
},
"jediHero": {
"name": "R2-D2"
}
}
}
在前面的代码示例中,都省略了query queryName的操作名称,在GraphQL规范中,如果省略操作名称,则默认为query操作类型。
完整的query代码:包含操作类型关键字:query,操作名称:HeroNameAndFriends
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
GraphQL中操作类型有:query(查询)、mutation(变更)、subscription等,除query外,都不能够省略。
在GraphQL语句中,还可以使用变量。这样就能在查询时等待前端交互式地输入具体值:
query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
friends {
name
}
}
}
变量的使用格式为:$variableName。这样,前端用户可以通过variableName: value的格式使用JSON数据文件传输具体的值给查询语句。
前面所介绍的语句是实现查询的功能,GraphQL还有一个很重要的功能是能够实现对数据更新。
在GraphQL中,实现对数据的更新的操作关键字是:mutation:
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
这段代码实现的是往数据库中插入一条数据记录,在这个语句中要注意的是:数据的参数均使用了$variableName格式的参数,即意味着具体值通过一个JSON文件中的variableName: value传入。Episode!中的“!”表示不能为null。