1.字段的使用
query Hero{
hero {
name
}
}
分析:name是hero字段的字段,由于GraphQL的查询与其结果是一致的,所以可以通过改变字段来改变想查询的结果
2.参数的使用
query Human{
human(id: "1000") {
name
height
}
}
分析:通过传入参数进行条件查询
3.别名的使用
query Hero{
empireHero: hero(id: "1") {
name
}
jediHero: hero(id: "2") {
name
}
}
分析:两个 hero
字段将会存在冲突,但是因为我们可以将其另取一个别名,我们也就可以在一次请求中得到两个结果
4.Fragments片段的使用
query Hero{
leftComparison: hero(id: "1") {
...comparisonFields
}
rightComparison: hero(id: "2") {
...comparisonFields
}
}
fragment comparisonFields on Character {
id
name
}
分析:将经常使用的字段组合在一起,在需要它们的的地方引入
5.变量的使用
query HeroNameAndFriends($episode: Episode = "JEDI") {
hero(episode: $episode) {
name
friends {
name
}
}
}
分析:变量前缀必须为 $
,后跟其类型,本例中类型为 Episode(自定义的枚举类型),Episode
后面并没有!,因此其是可选的。但是如果你传递变量的字段要求非空参数,那就要加上!,本例中给变量episode赋了一个默认值"JEDI"
6.指令的使用
query Hero($episode: Episode, $withFriends: Boolean!) {
hero(episode: $episode) {
id
name @include(if: $withFriends)
}
}
分析:一个指令可以附着在字段或者片段包含的字段上,然后以任何服务端期待的方式来改变查询的执行,GraphQL 的核心规范包含两个指令:(1)@include(if: Boolean)
仅在参数为 true
时,包含此字段;(2)@skip(if: Boolean)
如果参数为 true
,跳过此字段
7.变更语句的使用
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
分析:review
变量并非标量。它是一个输入对象类型,一种特殊的对象类型,可以作为参数传递;查询和变更之间名称之外的一个重要区别是:查询字段时,是并行执行,而变更字段时,是线性执行,一个接着一个
8.Schema的类型与字段
type Character {
name: String!
appearsIn: [Episode]!
}
分析:(1)Character 是一个 GraphQL 对象类型,表示其是一个拥有一些字段的类型。你的 schema 中的大多数类型都会是对象类型;(2)name
和 appearsIn
是 Character
类型上的字段。这意味着在一个操作 Character
类型的 GraphQL 查询中的任何部分,都只能出现 name
和 appearsIn
字段(3)[Episode]!
表示一个 Episode
数组。因为它也是非空的,所以当你查询 appearsIn
字段的时候,你也总能得到一个数组(零个或者多个元素)
9.Schema的参数
query {
hero {
name
}
droid(id: "2000") {
name
}
}
type Query {
hero: Character
droid(id: ID!): Droid
}
分析:GraphQL 对象类型上的每一个字段都可能有零个或者多个参数,在本例中,id就是参数
10.标量类型
Int:有符号 32 位整数
Float:有符号双精度浮点值
String:UTF‐8 字符序列
Boolean:true 或者 false
ID:ID 标量类型表示一个唯一标识符,通常用以重新获取对象或者作为缓存中的键
11.Schema的枚举类型
enum Episode {
NEWHOPE
EMPIRE
JEDI
}
12.接口的使用
interface Character {
id: ID!
name: String!
}
type Human implements Character {
id: ID!
name: String!
totalCredits: Int
}
分析:任何实现Character
的类型都要具有这些字段,并有对应参数和返回类型
13.内联片段的使用
query HeroForEpisode($ep: Episode!) {
hero(episode: $ep) {
name
... on Droid {
primaryFunction
}
}
}
分析:用于查询一个只存在于特定对象类型上的字段