什么是 GraphQL?
简单来说,这就像你去披萨店点一份“自己做”的披萨——你选择饼底、酱汁、奶酪和配料,披萨烤好后,你就能得到你想要的。有了 REST,你就可以从预先定义的菜单项中挑选披萨了。你可能会得到你想要的配料,但也可能会得到你没有点的其他配料(比如西红柿),有时,我们不得不手动把西红柿挑出来。
从技术角度来说,GraphQL 是一种查询语言——一种用于从任何数据源(无论是 API 还是数据库)查询数据的语法。GraphQL 是 REST API 的替代方案,并提供了一种新的数据请求方式。GraphQL 允许您指定所需的数据字段,并准确地提供这些字段。GraphQL规范定义了实现 GraphQL API 的规则集。
需要注意的是,GraphQL 不是数据库的查询语言。与 SQL 不同,GraphQL 没有针对SELECT * from users
数据库的查询。相反,GraphQL 语法定义了如何从 API 中请求数据。GraphQL 查询的语法如下所示:
query getUsers{
users {
firstname
}
}
因此,QL
GraphQL 中的意思是 API 的查询语言,而不是数据库。
值得一提的是,GraphQL 可以与任何数据源(例如 REST API 和数据库)一起使用。它可以插入任何地方,用任何语言构建,并且可以安装在任何数据库和技术栈之上。这意味着您可以在 REST API 上使用 GraphQL,并且仍然可以获得 GraphQL 的优势,而无需拆除现有的基于 REST 的架构。您可以在 Java 应用、JavaScript 应用、Python、Django 和 NextJS 中使用 GraphQL。
GraphQL 适用于客户端和服务器端。您可以在服务器端构建 GraphQL API,然后在客户端通过触发 GraphQL 请求(查询、变更等)来使用该 API。有一些工具(例如Apollo)提供全栈解决方案,帮助您在服务器上构建 GraphQL API 并在客户端使用它。
GraphQL 术语
- 查询:查询类似于 REST 中的 GET。当我们想从 GraphQL API 获取信息时,我们会使用查询。
- 变异:当我们想要改变服务器上的数据时,就会使用变异。变异类似于 REST API 中的 PUT、POST、DELETE 和 PATCH。
- Schema:Schema 是 GraphQL API 支持的操作的完整表示。
REST 与 GraphQL 示例:发出 API 请求
假设我们要获取用户名。在 REST API 中,我们有一个端点可以用来发出 GET 请求。该端点可能看起来像这样/users/{id}/
。如果我们使用 curl 请求进行调用并传入id
用户信息,它将看起来像这样 -
curl \
-H "Content-Type: application/json" \
https://www.example.com/api/users/123`
让我们看看 GraphQL 请求是什么样子的 -
-
REST 的“GET”操作在 GraphQL 中通过“Query”来完成。
-
users
GraphQL 中没有单独的端点。每个请求都会发送到/graphql
端点。 -
为了描述我们感兴趣的数据,我们将相关参数传递给“Query”操作并描述我们对哪个Query感兴趣。GraphQL API 可能支持类似“getUsers”Query 的东西,这是我们可以用来获取用户的查询。
对 GraphQL API 的 curl 请求如下所示 -
curl \
-X POST \
-H "Content-Type: application/json" \
--data '{ "query": "{ user(id:123 ) { name } } " }' \
https://www.example.com/graphql
REST 与 GraphQL:实现 API
在 REST 世界中,我们会为每个操作提供资源实现,例如GET /user/{id}
映射到getUser(String id)
。getUser
定义调用此端点时传递的数据。此资源实现还会根据需要调用任何下游操作——其他 API 或直接从数据库获取数据。
在 GraphQL 中,实现 GraphQL API 时,我们首先需要定义 API 的架构 (Schema)。架构是对允许哪些查询、修改和参数的完整描述。在 GraphQL 中,“GET” 操作由“查询”完成。我们可以在架构中指定查询接受的参数。
type Query {
getUser(id: $String!)
}
我们从这个getUser
查询返回的内容由一个名为 resolvers 的函数定义。解析器定义在调用某个字段时应该返回什么数据。每个查询都映射到一个解析器。解析器函数可以调用任何 API 或数据源。我们的解析器可以这样写:
getUser(args){
const { id } = args;
//fetch from database / API
}
当客户端获取getUser
查询时,他们将获得如下数据 -
{
"data" : {
"name": "Sample name"
}
}
REST 和 GraphQL 之间的主要区别
休息 | GraphQL |
---|---|
REST 有多个端点。 | GraphQL 有一个端点 - /graphql |
REST API 支持 PUT、GET、POST、DELETE、PATCH | GraphQL 支持查询、修改、订阅 |
REST 端点由资源实现填充 | GraphQL 字段由解析器填充 |
200、400、500 级状态代码 | 200 级状态代码 |
通常需要进行往返才能获取完整的数据 | 您可以获取多个字段,因此只需一个请求即可获取所需的所有数据 |
数据的形状由服务器决定 | 数据的形状由调用 API 的客户端决定。 |
何时使用 GraphQL 与 REST
何时使用 GraphQL
- 当你有多个下游 API 时
- 当你有来自下游 API 的无关数据时
- 当你关心哪些字段被哪些客户端使用时,借助 GraphQL,你可以进行字段级别的检测。
- 当你关心确保所有客户端都拥有最新版本的 API 时。使用 GraphQL,由于只有一个端点,因此所有更新都会提供给所有人。
- 当您想要构建 UI-first API 时。
- 当您关心获取不足和获取过度时。
何时使用 REST
- 当您严重依赖缓存时。
- 如果您不知道下游 API 中可能包含的完整字段,则可以使用 GraphQL。使用 GraphQL 时,您需要预先了解其架构。
- 当你严重依赖下游 API 的状态码时。GraphQL 中的所有内容都是 200,因此你需要解析响应对象或错误对象。
学习 GraphQL 的先决条件
虽然我认为没有必要有任何先决条件,但了解以下内容会有所帮助 -
- API 开发基础知识
- REST API
- HTTP
- 实现 GraphQL API 的首选语言 - JavaScript、Go、Java、Python 等。
学习 GraphQL 的资源
TL;DR
简而言之,GraphQL 是一种用于请求数据的语法。REST 和 GraphQL 之间的最大区别在于,前者只有一个端点 - graphql
,除了调用 API 端点并传递所需参数外,我们还需要提供我们想要访问的具体字段。
从技术角度来说,GraphQL 是一种规范,提供了一种数据查询的方式。该规范规定了请求和修改数据时应该发生的情况。GraphQL 规定了一种请求数据的方式,并准确地提供所请求的数据。由于它是一种规范,因此 GraphQL API 可以使用 JavaScript、Java、Go 和 Python 等语言创建。
我发布的其他 GraphQL 资源 -
- 什么是 GraphQL 以及为什么要使用它 - 前端欢乐时光播客
- 常见的 GraphQL 误解
- 在企业中使用 GraphQL
- 从 Redux 迁移到 GraphQL
- GraphQL 和状态管理
- GraphQL Hub - 正在建设中
文章来源:https://dev.to/shrutikapoor08/what-is-graphql-hj5