sfsoul / personalBlog

思考与总结
MIT License
1 stars 0 forks source link

Graphql #18

Open sfsoul opened 3 years ago

sfsoul commented 3 years ago

查询和变更

指令(Directives)

一个指令可以附着在字段或者片段包含的字段上,然后以任何服务端期待的方式来改变查询的执行。

query Hero($episode: Episode, $withFriends: Boolean!) {
    hero(episode: $episode) {
        name
        friends @include(if: $withFriends) {
            name
        }
    }
}

{
    "episode": "JEDI",
    "withFriends": false
}

GraphQL 的核心规范包含两个指令:

变更(Mutations)

变更中的多个字段(Multiple fields in mutations)

查询和变更之间名称之外的一个重要区别是:查询字段时,是并行执行,而变更字段时,是线性执行,一个接着一个。

意味着若一个请求中发送了两个 incrementCredits 变更,第一个保证在第二个之前执行,以确保不会出现竞态。

sfsoul commented 3 years ago

Schema 和类型

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

一个 GraphQL schema 中的最基本的组件是对象类型,它就表示你可以从服务上获取到什么类型的对象,以及这个对象有什么字段。

type Character {
    name: String!
    appearsIn: [Episode!]!
}

参数(Arguments)

// length 字段定义了一个参数:unit
type Starship {
    id: ID!
    name: String!
    length(unit: LengthUnit = METER): Float
}

参数可能是必选或者可选的,当一个参数是可选的,可定义一个默认值 -- unit 参数没有传递,那么它将会被默认设置为 METER

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

schema 中大部分的类型都是普通对象类型,但是一个 schema 内有两个特殊类型:

schema {
    query: Query
    mutation: Mutation
}

标量类型(Scalar Types)

枚举类型(Enumeration Types)

枚举类型是一种特殊的标量,它限制在一个特殊的可选值集合内。

enum Episode {
    NEWHOPE
    EMPIRE
    JEDI
}

这表示无论在 schema 的哪处使用了 Episode,都可以肯定它返回的是 NEWHOPEEMPIREJEDI 之一。

列表和非空(Lists and Non-Null)

列表的运作方式:使用一个类型修饰符来标记一个类型为 List,表示这个字段会返回这个类型的数组。在 GraphQL schema 语言中,通过将类型包在方括号([])中的方式来标记列表。列表对于参数也是一样的运作方式,验证的步骤会要求对应值为数组。

非空和列表修饰符可以组合使用。

// 要求一个非空字符串的数组
myField: [String!]

这表明数组本身可以为空,但是其不能有任何空值成员。

// 定义一个不可为空的字符串数组
myField: [String]!

这表示数组本身不能为空,但是其可以包含空值成员。

接口(Interfaces)

一个接口是一个抽象类型,它包含某些字段,而对象类型必须包含这些字段,才能算实现了这个接口。

联合类型(Union Types)

输入类型(Input Types)

输入 对象看上去和常规对象一模一样,除了关键字是 input 而不是 type

input ReviewInput {
    stars: Int!
    commentary: String
}

// 在变更中使用输入对象类型:
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
    createReview(episode: $ep, review: $review) {
        stars
        commentary
    }
}