项目学习GraphQL(二)

戚正业
2023-12-01

2.GraphQL基本概念

本章节部分内容和案例代码参考自:http://graphql.cn

2.1 字段

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"
        }
      ]
    }
  }
}

2.2 参数

在GraphQL的query中,还可以使用参数:

{
  human(id: "1000") {
    name
    height(unit: FOOT)
  }
}

查询id="1000"的human数据对象,结果包含name和height属性:

{
  "data": {
    "human": {
      "name": "Luke Skywalker",
      "height": 5.6430448
    }
  }
}

2.3 别名(Aliases)

写过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"
    }
  }
}

2.4 操作名称

在前面的代码示例中,都省略了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外,都不能够省略。

2.5 变量

在GraphQL语句中,还可以使用变量。这样就能在查询时等待前端交互式地输入具体值:

query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}

变量的使用格式为:$variableName。这样,前端用户可以通过variableName: value的格式使用JSON数据文件传输具体的值给查询语句。

2.6 变更(mutation)

前面所介绍的语句是实现查询的功能,GraphQL还有一个很重要的功能是能够实现对数据更新。
在GraphQL中,实现对数据的更新的操作关键字是:mutation:

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

这段代码实现的是往数据库中插入一条数据记录,在这个语句中要注意的是:数据的参数均使用了$variableName格式的参数,即意味着具体值通过一个JSON文件中的variableName: value传入。Episode!中的“!”表示不能为null。

 类似资料: