GraphQL系列 - 第1讲 GraphQL语法入门

目录

一、介绍GraphQL

GraphQL 是一种用于 API 的查询语言以及一个用于执行查询的服务器端运行时。它由 Facebook 开发,并在 2015 年开源。GraphQL 的主要目的是提供一种更高效、灵活的数据查询方式,替代传统的 REST API。

基本功能

基本功能 描述
类型系统 使用强类型系统定义 API 的数据结构。
查询 客户端可以通过查询请求精确地获取所需的数据,减少数据传输量。
变更(Mutation) 支持变更操作,用于创建、更新或删除数据。
订阅(Subscription) 支持订阅功能,允许客户端订阅数据的变化,并在数据发生变化时接收实时更新。
解析器(Resolver) 服务器端的函数,用于处理查询和变更请求。每个字段都有一个解析器来获取相应的数据。

使用场景

使用场景 描述
复杂数据需求 当客户端需要从多个资源中获取数据时,通过单个请求获取所有所需数据。
前端开发 前端开发人员可以精确地查询所需数据,减少不必要的数据传输。
微服务架构 作为聚合层,统一多个微服务的数据接口,简化客户端的调用逻辑。
实时应用 通过订阅功能,适合需要实时数据更新的应用,如聊天应用、股票行情等。

使用者

使用者 描述
Facebook GraphQL 的发明者,广泛使用 GraphQL。
GitHub 提供基于 GraphQL 的 API,允许开发者查询和操作 GitHub 数据。
Shopify 使用 GraphQL 提供其 API,帮助开发者构建电商应用。
Twitter 使用 GraphQL 优化其数据查询和传输。
Pinterest 通过 GraphQL 提供其 API,简化数据获取过程。

GraphQL 通过其灵活性和高效性,已经成为现代 Web 开发中不可或缺的一部分,广泛应用于各种复杂数据需求的场景。

二、GraphQL基本使用方法

GraphQL 是一种用于 API 的查询语言和一个用于执行查询的服务器端运行时,GraphQL 的基本使用方法如下:

  1. 定义 Schema:Schema 定义了 API 中的数据类型及其关系。
  2. 编写查询:客户端编写查询请求特定的数据。
  3. 执行查询:服务器执行查询并返回请求的数据。

三、Schema 定义语言 (SDL)

注:

详细语法说明参见:https://graphql.cn/learn/

GraphQL 的 Schema 定义语言 (SDL) 用于描述 API 的数据结构和操作。以下是一些常见的语法和示例:

3.1 类型定义

在 GraphQL 的 Schema 定义中,支持多种字段类型。以下是一些常见的字段类型及其说明。

1)对象类型

对象类型用于定义复杂的数据结构,可以包含多个字段,每个字段可以是任意类型(包括标量类型和其他对象类型)。

graphql 复制代码
type Person {
    id: ID!
    name: String!
    age: Int
    friends: [Person]
}
2)标量类型
  1. Int:整数类型,表示有符号 32 位整数。

    graphql 复制代码
    type Example {
        age: Int
    }
  2. Float:浮点数类型,表示有符号双精度浮点数。

    graphql 复制代码
    type Example {
        price: Float
    }
  3. String:字符串类型,表示 UTF-8 字符序列。

    graphql 复制代码
    type Example {
        name: String
    }
  4. Boolean :布尔类型,表示 truefalse

    graphql 复制代码
    type Example {
        isActive: Boolean
    }
  5. ID:唯一标识符类型,通常用作对象的唯一标识。

    graphql 复制代码
    type Example {
        id: ID
    }
3)枚举类型

枚举类型用于定义一组可能的值。

graphql 复制代码
enum Role {
    ADMIN
    USER
    GUEST
}
4)输入类型

输入类型用于变更操作的输入参数。

graphql 复制代码
input PersonInput {
    name: String!
    age: Int
}
5)列表类型

列表类型表示一组相同类型的值。

graphql 复制代码
type Example {
    tags: [String]
}
6)非空类型

非空类型表示字段不能为空,在类型后面加 ! 表示。

graphql 复制代码
type Example {
    name: String!
}
7)接口类型

接口类型定义一组必须实现的字段。

graphql 复制代码
interface Character {
    id: ID!
    name: String!
}
8)联合类型

联合类型表示多个可能的类型。

graphql 复制代码
union SearchResult = Person | Post

这些字段类型可以组合使用,以定义复杂的数据结构和操作。

3.2 查询和变更

  1. 查询类型:定义读取数据的入口点。

    graphql 复制代码
    type Query {
        person(id: ID!): Person
        people: [Person]
    }
  2. 变更类型:定义写入数据的入口点。

    graphql 复制代码
    type Mutation {
        addPerson(input: PersonInput!): Person
    }

四、示例

4.1 schema定义示例

以下是一个完整的 Schema 示例:

graphql 复制代码
type Query {
    person(id: ID!): Person
    people: [Person]
}

type Mutation {
    addPerson(input: PersonInput!): Person
}

type Person {
    id: ID!
    name: String!
    age: Int
}

enum Role {
    ADMIN
    USER
    GUEST
}

input PersonInput {
    name: String!
    age: Int
}

这个示例定义了一个 Person 类型,一个 Role 枚举,一个 PersonInput 输入类型,以及查询和变更类型。

4.2 查询示例

  1. 查询单个 Person

    graphql 复制代码
    {
        person(id: "1") {
            id
            name
            age
        }
    }

    结果示例

    json 复制代码
    {
        "data": {
            "person": {
                "id": "1",
                "name": "John Doe",
                "age": 30
            }
        }
    }
  2. 查询所有 People

    graphql 复制代码
    {
        people {
            id
            name
            age
        }
    }

    结果示例

    json 复制代码
    {
        "data": {
            "people": [
                {
                    "id": "1",
                    "name": "John Doe",
                    "age": 30
                },
                {
                    "id": "2",
                    "name": "Jane Smith",
                    "age": 25
                }
            ]
        }
    }
  3. 添加一个新的 Person

    graphql 复制代码
    mutation {
        addPerson(input: { name: "Alice", age: 28 }) {
            id
            name
            age
        }
    }

    结果示例

    json 复制代码
    {
        "data": {
            "addPerson": {
                "id": "3",
                "name": "Alice",
                "age": 28
            }
        }
    }

相关推荐
建投数据9 分钟前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
向前看-40 分钟前
验证码机制
前端·后端
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu