GraphQL - Getting started2018-08-12 19:45GraphQL

GraphQL: Getting started

Fields

  • 输出的格式会按照输入的格式返回

输入格式:

{
  hero {
    name
  }
}

返回格式:

{
  "data": {
    "hero": {
      "name": "R2-D2"
    }
  }
}

输入格式:

{
  hero {
    name
    # Queries can have comments!
    friends {
      name
    }
  }
}

返回格式:

{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}

Arguments

就是给不同的 field 添加各种不同的条件.

{
  human(id: "1000") {
    name
    height(unit: FOOT)
    # 这里用的是枚举的值
  }
}

Alias

  empireHero: hero(episode: EMPIRE) {

    name

  }
  # 这段查询查询的是 hero 表里面拥有 episode = EMPIRE 的数据
  jediHero: hero(episode: JEDI) {

    name

  }
  # 这段查询查询的也是 hero
  # 如果不添加别名返回两个拥有相同名称的 key
}

Fragments

这个实际上就是一些可以复用的块


{
  leftComparison: hero(episode: EMPIRE) {

    ...comparisonFields

  }
  rightComparison: hero(episode: JEDI) {

    ...comparisonFields

  }
}

fragment comparisonFields on Character {
  name
  appearsIn
  friends {

    name

  }
}

Operation Name

上方 query 用的都是简化版, 其实 防止歧义 以及 方便调试 应该使用 query 操作符:


query HeroNameAndFriends {
  hero {

    name

    friends {
      name
    }
  }
}

Variables

使用动态语句拼成 query string 不是一个好方法

这也可以使用变量来进行解决,这样从客户端就只需要传进来一个值


# {"graphiql": true, "variables": { "episode": JEDI} }

query HeroNameAndFriends($episode: Episode) {
  hero(episode: $episode) {

    name

    friends {
      name
    }
  }
}

Variable Definitions

例如上方的例子中:


query HeroNameAndFriends($episode: Episode)

# 这里限定了变量名称为 $episode 并且类型为 Episode

也可以给默认值:


query HeroNameAndFriends($episode: Episode = "JEDI")

也可以限定这个值为必须提供:


query Hero($withFriends: Boolean!)

Directives 指令

类似于环绕条件:


query Hero($episode: Episode, $withFriends: Boolean!) {
  hero(episode: $episode) {

    name

    friends @include(if: $withFriends) {
    # 上传进来的变量可以到这个地方使用
    # 使用 @include 的情况, 除非后面条件为真否则当前 field 无效
      name
    }
  }
}

Mutation

一个非常重要的 Hint, Mutation 是串行执行, 而普通 **query 是并行执行 **


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

    stars
    commentary

  }
}

Mutation 就类似于我们希望根据客户端发出的内容进行修改返回的内容

比如说去上方的 Mutation 我们提供:


{
  "ep": "JEDI", 
  "review": {

    "stars": 5,
    "commentary": "This is a great movie!"

  }
}

最终返回的就是这样的值:


{
  "data": {

    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }

  }
}

Types


type Character {
  name: String!
  # 注意 name 仅仅是这个 type 的 attr, attr 的名字可以随意, 除了下方提到的两个特殊关键字
  appearsIn: [Episode]!
  # 方括号代表这个东西是一个数组
}

type Starship {
  id: ID!
  name: String!
  length(unit: LengthUnit = METER): Float
  # 这里使用了一些参数, 这个参数的名字叫做 unit, 并且类型是 LengthUnit, 并且默认值是 METER
}

特定的关键字


schema {
  query: Query
  mutation: Mutation
}

在查询的时候:

  • query 必须提供
  • mutation 可选

枚举


enum Episode {
  NEWHOPE
  EMPIRE
  JEDI
}
Powered by Remix
|
Designed by szhshp
|
Copyright © szhshp 2022