我试图总结GraphQL
GraphQL是一个开源的查询语言和运行时环境,用于从客户端向服务器获取数据。它允许客户端根据其需要明确地声明要返回哪些数据,从而避免了过度获取或多次请求的问题。
是由Facebook开发的一种用于API的查询语言,它使用现有数据来执行查询的运行时。
GraphQL提供了对API内数据的全面可理解的描述,赋予客户端准确请求所需内容的能力,并使API的长期发展更加便捷,提供了强大的开发工具。
查询语言和模式语言
GraphQL通常由查询语言和模式语言组成。
查询语言(前端)是一种用于GraphQL API请求的语言,涉及数据获取的查询、数据更新的变更、以及从服务器端接收事件通知的订阅,共有三种类型。
一般来说,我们会使用查询和变更。
数据库语言(服务器端)是一种用于描述GraphQL API规范的语言,并根据所描述的数据库生成响应。
GraphQL通过Post请求进行查询和变异,但为了与REST对应,使其更容易理解。
领域
在GraphQL中,有两种类型的字段可通过查询获取:标量类型和对象类型。GraphQL支持以下五种类型:
– 整数类型(Int)
– 浮点数类型(Float)
– 字符串类型(String)
– 布尔类型(Boolean)
– 标识符类型(ID),实际上是字符串类型(String)
此外,对象匹配是由一个或多个字段组成的组,并以嵌套JSON的形式呈现。
终节点

GraphQL服务器端处理的流程
-
- 设置模式(例如:Schema)
-
- 判断query/mutation
-
- 判断是否需要变量(input)
-
- 为每个query/mutation请求分配解析器(resolver)
-
- 在解析器中进行详细处理和返回值
-
- 处理返回值的要求
- 进行处理与返回值相关的操作
需要实现诸如此类等等的全部内容。
→ 手动实现很辛苦。
→ 可以使用 gqlgen 等工具来自动生成样板代码。
一个简单的例子
type Query {
docs: [Document!]!
}
type Document {
id: ID!
title: String!
description: String!
file: String!
}
假设要针对该模式进行查询
query {
docs {
id
title
}
}
可以这样理解。这意味着获取docs的id和title。如果需要description和file等信息,可以通过相应描述来获取数据。
此外,针对多个schema,
type Query {
user(username: String!): User!
}
type User {
id: ID!
username: String!
password: String!
email: String!
}
query {
user(username:"your name") {
id
username
email
}
docs {
id
title
description
}
}
就像这样,可以向多个解析器发送查询,并且还可以减少请求的次数。
优点
-
- 必要な情報しか通信が行われない
-
- エンドポイントが1つですむ
-
- リクエストの回数を減らすことができるかも
-
- 型の検証を行いながらリクエストできる
- バックエンド側の調整なしに、フロント側で情報を選択し、取得することができる
缺点
-
- サーバー側の処理の実装が難しい
スキーマの全てのパターンの実装が必要とになってくる
スキーマを元に、自動で枠組みを生成してくれるライブラリなどを利用する場合もある
gqlgenやgraphql-goなど
データのキャッシュがめんどくさい
RESTのキャッシュは、エンドポイントに応じてキャッシュの処理を行う
GraphQLの場合、一意のIDを定義し、正規化されたキャッシュを構築する。クライアントが構築されたオブジェクトを参照するクエリを発したら、キャッシュを返すという仕組みになっている
考慮
如果有任何错误或额外的指正,请您告诉我,我将不胜感激。