在学习开始前,我习惯先用gpt了解一个这是个什么东西:
GraphQL是一种用于API开发的查询语言和运行时环境。它由Facebook于2012年开发并在2015年开源,旨在解决传统RESTful API的一些限制和缺点。
在GraphQL中,客户端可以通过发送查询语句来精确地请求需要的数据,而不是像RESTful API那样只能获取固定格式的数据。这种灵活性使得客户端可以根据自身需求定制数据的返回格式,减少了网络请求的数据传输量,提高了API的效率。
学习参考文档:GraphQL 入门 | GraphQLhttps://graphql.cn/learn/
GraphQL与restful的区别
在学习GraphQL前,我发送请求用得是restful。
restful:Representational State Transfer 表属性状态转移。本质上就是用定义url,通过api接口来取得资源。通用系统框架,不受语言限制。
- restful接口只能返回一个资源,graphql一次可以获取多个资源。
- restful用不同的 url 来区分资源,graphql用 类型区分资源。
使用express+GraphQL
上面graphql里的buildSchema是干嘛的呢:
`buildSchema`是GraphQL中中的函数,用于构建GraphQL的Schema(模式)。
Schema在GraphQL中定义了API的类型 和查询方式 ,描述可用的数据和操作 。
`buildSchema`函数通常用于创建一个GraphQL Schema对象,该Schema对象包含了定义API的类型和操作的信息。开发者可以在Schema中定义数据类型(如对象类型、标量类型、枚举类型)、查询类型(Query)、变异类型(Mutation)等。
在使用`buildSchema`函数时,开发者可以**通过传入一个描述GraphQL Schema的字符串参数来定义Schema的结构。**这个描述字符串通常遵循GraphQL Schema语言的语法规则,用于描述Schema的类型、字段、查询方式等信息。`buildSchema`函数会根据这个描述字符串构建出一个GraphQL Schema对象,供后续的查询和操作使用。
示例代码如下所示,演示了如何使用`buildSchema`函数创建一个简单的GraphQL Schema:
javascript
const { buildSchema } = require('graphql');
// 定义一个GraphQL Schema的描述字符串
const schemaString = `
type Query {
hello: String
}
`;
// 使用buildSchema函数构建Schema对象
const schema = buildSchema(schemaString);
// 输出Schema对象
console.log(schema);
在项目中,我们可以单独用gql后缀的文件去集中编辑schema语句。
基本参数类型和参数传递
基本参数类型
1️⃣基本类型:String,Int,Float,Boolean和ID。可以在shema声明的时候直接使用。
其中ID类似于数据库中的ID,它是不能重复的,本质上是字符串类型。
2️⃣[ 类型 ] 代表数组,比如 [ int ] 代表整型数组。
参数传递
1️⃣和js传递参数一样,小括号内定义形参,但需要注意:参数需要定义类型!
2️⃣!(即感叹号)代表参数不能为空
TypeScript
type Query {
fun(num1:Int!,num2s:Int):[Int]
}
上面意思是fun方法,第一个参数名字为num1,int类型,不能为空;第二个参数名字为num2,int类型;返回值为int数组类型。
自定义参数类型
GraphQl允许用户自定义参数类型,提出用来描述要获取的资源的属性。
GraphQL client
query语句里的格式:
TypeScript
query {
user(id: 123) {
id
name
email
posts {
title
content
}
}
}
query + 接口名字 + 参数名字 + 需要的字段列表
使用Motations修改数据
在GraphQL中,Mutation是一种用于修改服务器端数据的操作类型。与查询(Query)用于读取数据不同,Mutation用于对数据进行创建、更新、删除等修改操作。通过Mutation,客户端可以向服务器端提交数据变更请求,并返回相应的结果。
- 查询使用query
- 修改数据使用Mutation
这里注意这两个前缀 input 和 type
1️⃣ type :在GraphQL中,type
关键字用于定义自定义的数据类型。我们可以在Mutation中定义一个自定义类型,用于表示Mutation操作的输入参数和返回结果。这个自定义类型可以包含Mutation操作所需的输入字段和返回字段。
TypeScript
type Mutation {
updateUser(input: UserInput!): User
}
上面定义了一个叫updateUser
的Mutation操作,接收参数UserInput
并返回User
类型的结果。
2️⃣input :在GraphQL中,input
关键字用于定义一个**输入对象类型,**用于传递Mutation操作的输入参数。Input对象通常用于封装多个输入字段,以便在Mutation中一次性传递多个参数。
TypeScript
input UserInput {
id: ID!
name: String
email: String
}
上面定义了一个叫UserInput
的输入对象类型,包含id
、name
和email
三个输入字段。这个输入对象类型可以作为Mutation操作的输入参数使用。
通过type
和input
标志,可以在GraphQL中定义Mutation操作所需的数据类型和输入参数结构 ,从而实现对服务器端数据的修改操作
认证与中间件
Constructing Type
1️⃣使用GraphQLObjectType定义Type(类型)
(左边)过去buildSchema一句话做完的事情,现在我们拆分成了三步来完成(右边第一步)下面2,3是第23步)
2️⃣使用GraphQLObjectType定义query(查询)
3️⃣创建shema
代码量上升了,但会更加便于维护。