GraphQL系列 - 第1讲 GraphQL语法入门
目录
- 一、介绍GraphQL
- 二、GraphQL基本使用方法
- 三、Schema 定义语言 (SDL)
- 3.1 类型定义
- 1)对象类型
- 2)标量类型
- 3)枚举类型
- 4)输入类型
- 5)列表类型
- 6)非空类型
- 7)接口类型
- 8)联合类型
- 3.2 查询和变更
- 四、示例
- 4.1 schema定义示例
- 4.2 查询示例
一、介绍GraphQL
GraphQL 是一种用于 API 的查询语言以及一个用于执行查询的服务器端运行时。它由 Facebook 开发,并在 2015 年开源。GraphQL 的主要目的是提供一种更高效、灵活的数据查询方式,替代传统的 REST API。
基本功能
| 基本功能 | 描述 |
|---|---|
| 类型系统 | 使用强类型系统定义 API 的数据结构。 |
| 查询 | 客户端可以通过查询请求精确地获取所需的数据,减少数据传输量。 |
| 变更(Mutation) | 支持变更操作,用于创建、更新或删除数据。 |
| 订阅(Subscription) | 支持订阅功能,允许客户端订阅数据的变化,并在数据发生变化时接收实时更新。 |
| 解析器(Resolver) | 服务器端的函数,用于处理查询和变更请求。每个字段都有一个解析器来获取相应的数据。 |
使用场景
| 使用场景 | 描述 |
|---|---|
| 复杂数据需求 | 当客户端需要从多个资源中获取数据时,通过单个请求获取所有所需数据。 |
| 前端开发 | 前端开发人员可以精确地查询所需数据,减少不必要的数据传输。 |
| 微服务架构 | 作为聚合层,统一多个微服务的数据接口,简化客户端的调用逻辑。 |
| 实时应用 | 通过订阅功能,适合需要实时数据更新的应用,如聊天应用、股票行情等。 |
使用者
| 使用者 | 描述 |
|---|---|
| GraphQL 的发明者,广泛使用 GraphQL。 | |
| GitHub | 提供基于 GraphQL 的 API,允许开发者查询和操作 GitHub 数据。 |
| Shopify | 使用 GraphQL 提供其 API,帮助开发者构建电商应用。 |
| 使用 GraphQL 优化其数据查询和传输。 | |
| 通过 GraphQL 提供其 API,简化数据获取过程。 |
GraphQL 通过其灵活性和高效性,已经成为现代 Web 开发中不可或缺的一部分,广泛应用于各种复杂数据需求的场景。
二、GraphQL基本使用方法
GraphQL 是一种用于 API 的查询语言和一个用于执行查询的服务器端运行时,GraphQL 的基本使用方法如下:
- 定义 Schema:Schema 定义了 API 中的数据类型及其关系。
- 编写查询:客户端编写查询请求特定的数据。
- 执行查询:服务器执行查询并返回请求的数据。
三、Schema 定义语言 (SDL)
注:
详细语法说明参见:https://graphql.cn/learn/
GraphQL 的 Schema 定义语言 (SDL) 用于描述 API 的数据结构和操作。以下是一些常见的语法和示例:
3.1 类型定义
在 GraphQL 的 Schema 定义中,支持多种字段类型。以下是一些常见的字段类型及其说明。
1)对象类型
对象类型用于定义复杂的数据结构,可以包含多个字段,每个字段可以是任意类型(包括标量类型和其他对象类型)。
type Person {id: ID!name: String!age: Intfriends: [Person]
}
2)标量类型
-
Int:整数类型,表示有符号 32 位整数。
type Example {age: Int } -
Float:浮点数类型,表示有符号双精度浮点数。
type Example {price: Float } -
String:字符串类型,表示 UTF-8 字符序列。
type Example {name: String } -
Boolean:布尔类型,表示
true或false。type Example {isActive: Boolean } -
ID:唯一标识符类型,通常用作对象的唯一标识。
type Example {id: ID }
3)枚举类型
枚举类型用于定义一组可能的值。
enum Role {ADMINUSERGUEST
}
4)输入类型
输入类型用于变更操作的输入参数。
input PersonInput {name: String!age: Int
}
5)列表类型
列表类型表示一组相同类型的值。
type Example {tags: [String]
}
6)非空类型
非空类型表示字段不能为空,在类型后面加 ! 表示。
type Example {name: String!
}
7)接口类型
接口类型定义一组必须实现的字段。
interface Character {id: ID!name: String!
}
8)联合类型
联合类型表示多个可能的类型。
union SearchResult = Person | Post
这些字段类型可以组合使用,以定义复杂的数据结构和操作。
3.2 查询和变更
-
查询类型:定义读取数据的入口点。
type Query {person(id: ID!): Personpeople: [Person] } -
变更类型:定义写入数据的入口点。
type Mutation {addPerson(input: PersonInput!): Person }
四、示例
4.1 schema定义示例
以下是一个完整的 Schema 示例:
type Query {person(id: ID!): Personpeople: [Person]
}type Mutation {addPerson(input: PersonInput!): Person
}type Person {id: ID!name: String!age: Int
}enum Role {ADMINUSERGUEST
}input PersonInput {name: String!age: Int
}
这个示例定义了一个 Person 类型,一个 Role 枚举,一个 PersonInput 输入类型,以及查询和变更类型。
4.2 查询示例
-
查询单个 Person
{person(id: "1") {idnameage} }结果示例
{"data": {"person": {"id": "1","name": "John Doe","age": 30}} } -
查询所有 People
{people {idnameage} }结果示例
{"data": {"people": [{"id": "1","name": "John Doe","age": 30},{"id": "2","name": "Jane Smith","age": 25}]} } -
添加一个新的 Person
mutation {addPerson(input: { name: "Alice", age: 28 }) {idnameage} }结果示例
{"data": {"addPerson": {"id": "3","name": "Alice","age": 28}} }
相关文章:
GraphQL系列 - 第1讲 GraphQL语法入门
目录 一、介绍GraphQL二、GraphQL基本使用方法三、Schema 定义语言 (SDL)3.1 类型定义1)对象类型2)标量类型3)枚举类型4)输入类型5)列表类型6)非空类型7)接口类型8)联合类型 3.2 查询…...
015:地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework安装教程
摘要:本文详细介绍地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework的安装流程。 一、软件介绍 ArcGIS Engine 10.2是由Esri公司开发的一款强大的GIS(地理信息系统)开发平台。该软件基于ArcGIS 10.2 fo…...
Android——显式/隐式Intent
概述 在Android中,Intent是各个组件之间信息通信的桥梁,它用于Android各组件的通信。 Intent 的组成部分 一、显式 Intent 第一种方式 Intent intent new Intent(this, ActFinishActivity.class);startActivity(intent);第二种方式 Intent intent …...
【鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式教程详解】
鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式详解 在使用uniapp打包的鸿蒙项目的过程中,由于生成的是app文件,而hdc传给鸿蒙HarmonyOS系统需要的是hap文…...
一篇文章入门傅里叶变换
文章目录 傅里叶变换欧拉公式傅里叶变换绕圈记录法质心记录法傅里叶变换公式第一步:旋转的表示第二步:缠绕的表示第三步:质心的表示最终步:整理积分限和系数 参考文献 傅里叶变换 在学习傅里叶变换之前,我们先来了解一…...
基于python的语音识别与蓝牙通信的温控系统
基于python的语音识别与蓝牙通信的温控系统毕设项目 大家好,我是陈辰学长,一名在 Java 圈辛勤劳作的码农。今日,要和大家分享的是一款基于python的语音识别与蓝牙通信的温控系统毕设项目。项目源码以及部署相关事宜,请联系陈辰学…...
Pandas Series学习
1.Series简介 Pandas Series类似表格的列(column),类似于一维数组,可以保存任何数据类型,具有标签(索引),使得数据在处理分析时更具灵活性。Series数据结构是非常有用的,…...
为什么要探索太空?这对我们有什么好处?
几个世纪以来,人类一直着迷于宇宙的奥秘,这驱使我们冒险离开地球,去探索太阳系之外的未知环境。在当今世界,我们为什么要进行太空探索之旅这个问题,远不止出于单纯的好奇。 归根结底,太空探索是一种必要之…...
uniapp开发【选择地址-省市区功能】,直接套用即可
一、效果展示 二、代码 <template><view><view class="user_info"><view class="item"...
3个模型的交互式多模型IMM,基于EKF的目标跟踪实例(附MATLAB代码)
文章目录 3个模型的IMM源代码运行结果代码介绍总结 3个模型的IMM 代码实现了基于 I M M IMM IMM(Interacting Multiple Model)算法的目标跟踪。它使用三种不同的运动模型(匀速直线运动、左转弯和右转弯)来预测目标的位置&#x…...
利用游戏引擎的优势
大家好,我是小蜗牛。 在当今快速发展的游戏产业中,选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎,为开发者提供了丰富的工具和资源,使他们能够高效地开发出优秀的游戏。本文将探讨如何…...
一致角色的视频且唇形同步中文配音和免费音效添加
现在AI可以免费生成不带水印、不限时长的视频了,并且视频里的角色可以进行唇形同步配音。最重要的是,我还会分享给大家,怎么生成角色一致的动画场景,怎么使用场景图片生成完整的视频,并且我还会介绍一款,我…...
Spring学习笔记_14——@Qualifier
Qualifier 1. 解释 当Spring中存在多个类型相同但是名称不同的Bean时,使用Autowired注解向类的构造方法、方法、参数、字段中注入Bean对象时,首先会根据Bean的类型注入,如果存在多个类型相同的Bean时,会根据Bean的名称注入&…...
高级SQL技巧详解与实例
在数据处理与分析领域,高级SQL技巧是提升效率与准确性的关键。本文将结合参考资料,对高级SQL技巧进行系统的整理与解读,并通过实例展示其应用。 一、窗口函数 窗口函数是一种在SQL中执行复杂计算的强大工具,它们允许用户在一组行…...
实现PC端和安卓手机的局域网内文件共享
文章目录 一、准备工作1.1 笔记本(Win10)的设置(主要可分为3大部分:更改共享设置、创建本地用户、选择共享文件)1.2 台式机(Win7)的设置 二、实现共享文件夹的访问2.1 笔记本(Win10)访问台式机(Win7)2.2 台式机(Win7)访问笔记本(Win10)(一定要…...
腾讯云云开发深度解读:云数据库、云模板与AI生成引用的魅力
腾讯云云开发平台为开发者和潜在用户提供了丰富的解决方案,其中的云数据库、云模板和AI生成引用等产品尤为引人注目。这篇文件是我个人对这些产品的能力、应用场景、业务价值、技术原理的介绍和深度解读,最后也简单写一下新手如何进行相关产品的初步使用…...
预览 PDF 文档
引言 在现代Web应用中,文件预览功能是非常常见的需求之一。特别是在企业级应用中,用户经常需要查看各种类型的文件,如 PDF、Word、Excel 等。本文将详细介绍如何在Vue项目中实现 PDF 文档的预览功能。 实现原理 后端API 后端需要提供一个…...
Chromium 在WebContents中添加自定义数据c++
为了能在WebContents中添加自定义数据先看下几个关键类的介绍。 一、WebContents 介绍: WebContents是content模块核心,是呈现 Web 内容(通常为 HTML)位于矩形区域中。 最直观的是一个浏览器标签对应一个WebContents,…...
【Apache Zookeeper】
一、简介 1、场景 如何让⼀个应⽤中多个独⽴的程序协同⼯作是⼀件⾮常困难的事情。开发这样的应⽤,很容易让很多开发⼈员陷⼊如何使多个程序协同⼯作的逻辑中,最后导致没有时间更好地思考和实现他们⾃⼰的应⽤程序逻辑;又或者开发⼈员对协同…...
13.音乐管理系统(基于SpringBoot + Vue)
目录 1.系统的受众说明 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图(图2.2.1-1) 2.2.2 系统功能表(表2.2.2…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
