什么是 GraphQL?

2025-06-07

什么是 GraphQL?

简单来说,这就像你去披萨店点一份“自己做”的披萨——你选择饼底、酱汁、奶酪和配料,披萨烤好后,你就能得到你想要的。有了 REST,你就可以从预先定义的菜单项中挑选披萨了。你可能会得到你想要的配料,但也可能会得到你没有点的其他配料(比如西红柿),有时,我们不得不手动把西红柿挑出来。

从技术角度来说,GraphQL 是一种查询语言——一种用于从任何数据源(无论是 API 还是数据库)查询数据的语法。GraphQL 是 REST API 的替代方案,并提供了一种新的数据请求方式。GraphQL 允许您指定所需的数据字段,并准确地提供这些字段。GraphQL规范定义了实现 GraphQL API 的规则集。

需要注意的是,GraphQL 不是数据库的查询语言。与 SQL 不同,GraphQL 没有针对SELECT * from users数据库的查询。相反,GraphQL 语法定义了如何从 API 中请求数据。GraphQL 查询的语法如下所示:

query getUsers{
    users {
        firstname
    }
}
Enter fullscreen mode Exit fullscreen mode

因此,QLGraphQL 中的意思是 API 的查询语言,而不是数据库。

值得一提的是,GraphQL 可以与任何数据源(例如 REST API 和数据库)一起使用。它可以插入任何地方,用任何语言构建,并且可以安装在任何数据库和技术栈之上。这意味着您可以在 REST API 上使用 GraphQL,并且仍然可以获得 GraphQL 的优势,而无需拆除现有的基于 REST 的架构。您可以在 Java 应用、JavaScript 应用、Python、Django 和 NextJS 中使用 GraphQL。

GraphQL 适用于客户端和服务器端。您可以在服务器端构建 GraphQL API,然后在客户端通过触发 GraphQL 请求(查询、变更等)来使用该 API。有一些工具(例如Apollo)提供全栈解决方案,帮助您在服务器上构建 GraphQL API 并在客户端使用它。

GraphQL 术语

  1. 查询:查询类似于 REST 中的 GET。当我们想从 GraphQL API 获取信息时,我们会使用查询。
  2. 变异:当我们想要改变服务器上的数据时,就会使用变异。变异类似于 REST API 中的 PUT、POST、DELETE 和 PATCH。
  3. 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`
Enter fullscreen mode Exit fullscreen mode

让我们看看 GraphQL 请求是什么样子的 -

  1. REST 的“GET”操作在 GraphQL 中通过“Query”来完成。

  2. usersGraphQL 中没有单独的端点。每个请求都会发送到/graphql端点。

  3. 为了描述我们感兴趣的数据,我们将相关参数传递给“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
Enter fullscreen mode Exit fullscreen mode

在此处尝试示例 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!)
}
Enter fullscreen mode Exit fullscreen mode

我们从这个getUser查询返回的内容由一个名为 resolvers 的函数定义。解析器定义在调用某个字段时应该返回什么数据。每个查询都映射到一个解析器。解析器函数可以调用任何 API 或数据源。我们的解析器可以这样写:

getUser(args){
    const { id } = args;
    //fetch from database / API 
}
Enter fullscreen mode Exit fullscreen mode

当客户端获取getUser查询时,他们将获得如下数据 -

{
    "data" : {
        "name": "Sample name"
    }
}
Enter fullscreen mode Exit fullscreen mode

REST 和 GraphQL 之间的主要区别

休息 GraphQL
REST 有多个端点。 GraphQL 有一个端点 - /graphql
REST API 支持 PUT、GET、POST、DELETE、PATCH GraphQL 支持查询、修改、订阅
REST 端点由资源实现填充 GraphQL 字段由解析器填充
200、400、500 级状态代码 200 级状态代码
通常需要进行往返才能获取完整的数据 您可以获取多个字段,因此只需一个请求即可获取所需的所有数据
数据的形状由服务器决定 数据的形状由调用 API 的客户端决定。

何时使用 GraphQL 与 REST

何时使用 GraphQL

  1. 当你有多个下游 API 时
  2. 当你有来自下游 API 的无关数据时
  3. 当你关心哪些字段被哪些客户端使用时,借助 GraphQL,你可以进行字段级别的检测。
  4. 当你关心确保所有客户端都拥有最新版本的 API 时。使用 GraphQL,由于只有一个端点,因此所有更新都会提供给所有人。
  5. 当您想要构建 UI-first API 时。
  6. 当您关心获取不足和获取过度时。

何时使用 REST

  1. 当您严重依赖缓存时。
  2. 如果您不知道下游 API 中可能包含的完整字段,则可以使用 GraphQL。使用 GraphQL 时,您需要预先了解其架构。
  3. 当你严重依赖下游 API 的状态码时。GraphQL 中的所有内容都是 200,因此你需要解析响应对象或错误对象。

学习 GraphQL 的先决条件

虽然我认为没有必要有任何先决条件,但了解以下内容会有所帮助 -

  1. API 开发基础知识
  2. REST API
  3. HTTP
  4. 实现 GraphQL API 的首选语言 - JavaScript、Go、Java、Python 等。

学习 GraphQL 的资源

  1. GraphQL.org
  2. howtographql
  3. Eve Porcello 撰写的 GraphQL 书籍
  4. Stephen Grider 的 Udemy 课程

TL;DR

简而言之,GraphQL 是一种用于请求数据的语法。REST 和 GraphQL 之间的最大区别在于,前者只有一个端点 - graphql,除了调用 API 端点并传递所需参数外,我们还需要提供我们想要访问的具体字段。

从技术角度来说,GraphQL 是一种规范,提供了一种数据查询的方式。该规范规定了请求和修改数据时应该发生的情况。GraphQL 规定了一种请求数据的方式,并准确地提供所请求的数据。由于它是一种规范,因此 GraphQL API 可以使用 JavaScript、Java、Go 和 Python 等语言创建。


我发布的其他 GraphQL 资源 -

  1. 什么是 GraphQL 以及为什么要使用它 - 前端欢乐时光播客
  2. 常见的 GraphQL 误解
  3. 在企业中使用 GraphQL
  4. 从 Redux 迁移到 GraphQL
  5. GraphQL 和状态管理
  6. GraphQL Hub - 正在建设中

在您的收件箱中获取类似文章
与我实时合作

文章来源:https://dev.to/shrutikapoor08/what-is-graphql-hj5
PREV
什么是 GraphQL——误解。
NEXT
GraphQL 入门