GraphQL学习——Schema和类型

  • 学习GraphQL类型系统
  • 类型系统如何描述可以查询的数据

类型系统(Type System)

  • Schema的意义

    • 对我们所需要的数据的确切描述
    • 可以选择什么字段
    • 服务器会返回那种对象
    • 这些对象下有哪些字段可用
  • 每个GraphQL服务都会定义一套类型,用以描述可能从服务查询到的数据

类型语言(Type Language)

  • GraphQL服务,不依赖于任何特定语言的句法句式与GraphQL schema沟通
  • GraphQL schema language与GraphQL的查询语言类似,用来与GraphQL schema之间沟通

对象类型和字段(Object Types and Fields)

  • GraphQL schema 基本组件是对象类型
    • 可从服务上获取到什么类型的对象
    • 对象有什么字段
type Character {
  name: String!
  appearsIn: [Episode]!
}

对上述schema进行声明

  • Character是一个GraphQL对象类型
  • name、appearsIn是Character上的字段,在操作Character类型的GraphQL查询中,智能出现name、appearsIn字段
  • String是内置的标量类型之一,标量类型是解析到单个标量对象的类型,无法在查询中对它进行次级选择
  • !表示字段是非空的,GraphQL服务保证查询此字段总会返回一个值
  • [Episode]!表示一个Episode数组,非空。

参数(Arguments)

  • GraphQL对象类型上,每一个字段都会有参数
  • 所有参数都是具名的,所有参数必须具名传递
  • 参数可能是 必选的 可选的
  • 若参数可选,可以为其定义默认值
type Starship {
  id: ID!
  name: String!
  length(unit: LengthUnit = METER): Float
}

查询和变更类型(The Query and Mutation Types)

  • 特殊类型:querymutation
  • 定义了每一个GraphQL查询的入口

标量类型(Scalar Types)

  • Int:有符号32位整数
  • Float:有符号双精度浮点数
  • String:UTF-8字符序列
  • Boolean:true/false
  • ID:表示一个唯一标示符,

自定义标量类型

scalar Date
  • 定义其序列化、反序列化、验证

枚举类型(Enumeration Types)

  • 枚举(enum),一种特殊的标量,限制在一个特殊可选集合内
    • 可验证这个类型的任何参数是可选值的一个
    • 与类型系统沟通,一个字段总是一个有限集合的其中一个值
enum Episode {
  NEWHOPE
  EMPIRE
  JEDI
}
  • 以上,表示,Episode返回后边三个值中的一个

列表和非空(Lists andNon-Null)

  • 仅可自定的类型:对象类型、标量、枚举
  • 可以对上述类型添加类型修饰符,来影响这些值的验证
type Character{
  name: String!
  appearsIn: [Episode]!
}
  • 非空与列表类型修饰符的组合使用
    • myField: [String!],表示一个非空字符串的数组,表示数组可以空,但是数组每项不能空
    • myField: [String]!,表示数组可以空,数组每项不能空
  • 可根据需求,嵌套任意层非空、列表修饰符

接口(Interfaces)

  • 一个接口是一个抽象类型,包含某些字段,对象类型必须包含这些字段,才能算实现了这个接口
interface Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
}
  • 以上接口,意味着,实现Character的类型要具有这些字段,并有对应参数和返回类型

联合类型(Union Types)

  • 类似接口,单不指定类型之间的任何共同字段
union SearchResult = Human | Droid | Starship
  • 上述表示,任何返回SearchResult类型的地方,可能得到Human/Droid/Starship。
  • 联合类型成员必须是具体对象类型,不能使用接口或其他联合类型来创造一个联合类型
// 查询
{
  search(text: "an") {
    ... on Human {
      name
      height
    }
    ... on Droid {
      name
      primaryFunction
    }
    ... on Starship {
      name
      length
    }
  }
}

// 结果
{
  "data": {
    "search": [
      {
        "name": "Han Solo",
        "height": 1.8
      },
      {
        "name": "Leia Organa",
        "height": 1.5
      },
      {
        "name": "TIE Advanced x1",
        "length": 9.2
      }
    ]
  }
}

输入类型(Input Types)

  • 用在变更中,很有用,比如,需要传递一个对象作为新建对象。
  • 关键字input
input ReviewInput {
  stars: Int!
  commentary: String
}
  • 使用的话
# 声明
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
  createReview(episode: $ep, review: $review) {
    stars
    commentary
  }
}
{
  "ep": "JEDI",
  "review": {
    "stars": 5,
    "commentary": "This is a great movie!"
  }
}
{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容