最重要的一些 GraphQL 面试题及答案

2025年3月17日 | 阅读11分钟

下面列出了一些经常被问到的GraphQL面试题及答案。

1) 什么是 GraphQL?

GraphQL 是由 Facebook 设计和开发的一种新的 API 标准。它是一种开源的服务器端技术,目前由全球众多公司和个人组成的庞大社区维护。它也是一个执行引擎,充当数据查询语言,用于获取声明式数据。

阅读更多关于 GraphQL 的信息: GraphQL


2) GraphQL 开发的初衷是什么?

GraphQL 最初由 Facebook 作为其移动应用的内部解决方案而开发。它的设计目的是为了优化 RESTful API 调用,并为 REST 提供一种灵活、健壮且高效的替代方案。它并非 REST 的替代品,而是编写 API 的另一种方式。

发布后,它在开发者中迅速普及,并成为构建 Web 服务与 REST 并行的流行解决方案。


3) 使用 GraphQL 的顶级公司有哪些?

有很多大型组织,如 Facebook、Github、Pinterest、Intuit、Coursera、Shopify、Dailymotion、Yelp 等,都在使用 GraphQL。实际上,GraphQL 是由 Facebook 自己设计和开发的。


4) GraphQL 如何利用数据加载过程?

当用户在 GraphQL 中获取数据时,它只检索客户端所需的最少数据量。即使对象模型包含很多字段,客户端也只能请求所需的字段。


5) GraphQL 是数据库技术吗?

不是。GraphQL 不是数据库技术。人们常常误以为 GraphQL 是数据库技术,但这并不正确。GraphQL 是用于 API 的数据查询和操作语言,而不是数据库。它也是一个服务器端运行时,用于在定义数据类型系统时执行查询。与 REST API 不同,GraphQL 服务器只提供一个端点,并响应客户端所请求的确切数据。

可以说,GraphQL 是与数据库无关的,可以与任何数据库一起使用。它也可以在没有数据库的情况下使用。


6) GraphQL 仅适用于 React / JavaScript 开发人员吗?

不。说 GraphQL 只适用于 React 或 JavaScript 开发人员是不正确的。GraphQL 是一种跨平台、开源的数据查询和操作语言,用于 API 技术,因此可以在任何需要 API 技术的情况下使用。

在后端,GraphQL 服务器支持多种语言,如 JavaPython.NETC#PHPR、Haskell、JavaScriptPerlRubyScalaGo、Elixir、Erlang 和 Clojure 等。因此,它可以与任何编程语言和框架实现,用于构建 Web 服务器。


7) 既然已经有了 REST 这样的 API,为什么还要使用 GraphQL?

这个问题常常会出现在脑海中:既然已经有了 REST 这样的 API,为什么还要使用 GraphQL?是的,我们已经有了名为 REST 的 API 用于数据通信,它遵循清晰且结构化的面向资源的方法。它还提供了一些很棒的想法,如无状态服务器、对资源的结构化访问等。但是,REST 在应对客户端快速变化的需求方面不够灵活。在这种情况下,当数据变得更复杂时,路由就会变长。有时,用单个请求获取数据会很困难。这就是为什么 Facebook 采取措施开发一种名为 GraphQL 的新 API 技术,以应对 REST 的局限性。


8) GraphQL 如何帮助开发人员选择除 HTTP 以外的协议来实现服务器?

GraphQL API 通常通过 HTTP 运行,它是一种与传输层无关的技术,因此你可以选择除 HTTP 以外的协议来实现服务器。


9) GraphQL 中的身份验证和授权是什么?

身份验证和授权是服务中使用的过程。有时人们会将这两个术语混淆,并互换它们的定义。

身份验证 (Authentication): 身份验证是用于声明身份的过程。当你想要使用用户名和密码登录某个服务时,就会进行身份验证。在这里,你必须验证自己的身份。在 GraphQL 中,身份验证可以通过常见的模式来实现,如 OAuth。OAuth 是一种开放协议,用于以简单标准化的方式从 Web、移动和桌面应用程序中实现安全授权。

授权 (Authorization): 另一方面,授权是用于提供权限规则的过程,这些规则指定了单个用户和用户组对系统中某些部分的访问权限。对于 GraphQL 中的授权实现,建议将任何数据访问逻辑委托给业务逻辑层,而不是直接处理。


10) 如何在 GraphQL 中处理错误?

在 GraphQL 中看到错误很容易。一个成功的 GraphQL 查询应该返回一个带有根字段“data”的 JSON 对象。如果你的请求查询失败或部分失败,你将在响应中看到第二个根字段“errors”。请看下面的示例。

示例

注意:有时,请求查询会失败或部分失败,是因为请求数据的用户没有正确的访问权限。


11) 如何在 GraphQL 中进行服务器端缓存?它与 REST 有何不同?

GraphQL 技术最大的顾虑是,与 REST 相比,维护服务器端缓存很困难。在 REST API 中,我们可以轻松地为每个端点缓存数据。这是因为数据的结构不会改变。另一方面,在 GraphQL API 中,客户端接下来会请求什么并不清楚,因此在 API 后面放置缓存层没有意义。这就是为什么在 GraphQL 中进行服务器端缓存很困难。


12) GraphQL 查询后会得到什么类型的响应?

在 GraphQL 中,当客户端发出查询请求时,服务器会返回 JSON 格式的响应。服务器返回的响应基于客户端用于请求的查询。


13) 什么是 GraphQL 中的过度获取 (Over-fetching)?

过度获取是指客户端在 API 请求中获取了过多或额外数据的响应。在过度获取中,响应中有大量你未使用到的额外数据。过度获取会不必要地增加有效载荷大小。


14) 什么是欠度获取 (Under-fetching)?

欠度获取是指客户端没有获取到足够数据的响应。欠度获取的响应不足以通过调用一个端点来满足,因此你需要调用第二个端点来满足你的请求,或者进行多次 API 调用来获取完整数据。


15) GraphQL 如何解决过度获取或欠度获取的问题?

过度获取和欠度获取都是可以通过使用 GraphQL 来解决的性能问题。如果你有完全正确的端点来为你的产品提供准确的数据,那么就不会出现这些问题。当您需要维护多个端点来获取准确的数据时,就会出现这些问题。这增加了数据负载,最终导致性能问题。

GraphQL 通过允许你请求服务器上你想要的确切数据来解决这个问题。在这里,你可以在单个请求中指定你需要什么,并从服务器获得你所需的确切结果,仅需一次响应。


16) 使用 GraphQL 相较于 REST,最显著的优势是什么?

使用 GraphQL 相较于 REST 的最显著优势列表

  • GraphQL 只有一个端点,而 REST 有多个端点。因此,GraphQL 比 REST 更具成本效益。您无需为不同的端点消耗资源。
  • 在 REST API 中,您需要使用多个请求来检索复杂的数据集,但在 GraphQL 中,您只需一个请求即可轻松执行复杂查询。
  • 您可以在 GraphQL 中更改请求数据格式,但在 REST 中无法做到这一点。
  • GraphQL 的开发速度比 REST 快。
  • GraphQL 在所有平台之间提供高度一致性,而在 REST 中,跨平台实现一致性则比较困难。
  • GraphQL 不支持自动缓存系统,而 REST 会自动使用缓存。

17) REST 像 GraphQL 一样也是查询语言吗?

不。REST 不是像 GraphQL 这样的查询语言。它是一个 Web 服务 API。


18) 真的只能使用 GraphQL 和 SQL 数据库吗?

不。GraphQL 是一种 API 查询语言,可以与任何 SQLNoSQL 数据库一起使用。


19) 什么是 SDL,它的作用是什么?

SDL 是 **Schema Definition Language(模式定义语言)** 的缩写。它用于编写模式。SDL 是用于编写 GraphQL 模式的语言。


20) GraphQL API 可以用于处理离线使用吗?

GraphQL 是一种 Web API 查询语言,仅设计用于在线工作。像 Relay 和 Apollo 这样的 GraphQL 库的缓存能力可以在某些情况下使用,但目前还没有开发或可用恰当的离线解决方案。


21) 你对 GraphiQL 了解多少?

GraphiQL 用于为 GraphQL 提供 UI 表示。它是一个浏览器内的 IDE,用于探索 GraphQL 并简化 GraphQL 的使用。GraphQL 支持实时错误高亮显示,因此您可以轻松地看到和处理错误。


22) GraphQL 是否支持像 REST 那样的服务器端缓存?

不。GraphQL 不支持像 REST 那样的服务器端缓存。


23) GraphQL 支持哪些主要操作?

GraphQL 支持三种类型的操作:查询 (query)、变更 (mutation) 和订阅 (subscription)。查询用于请求,是一种读操作;变更用于写操作;订阅用于监听任何数据变化。当数据发生变化时,服务器会向客户端发送通知消息,前提是客户端订阅了该事件。


24) 可以使用查询来修改数据吗?

可以。查询可以用于修改服务器端数据。但根据传统方法,最好使用变更 (mutation) 来进行任何写操作。


25) GraphQL 中的 Apollo 是什么?

Apollo 是实现 GraphQL 的一个平台。我们知道 GraphQL 是一种查询语言,所以为了方便使用这种查询语言,我们需要一个平台,Apollo 提供这个平台。

Apollo 提供了两个开源库来创建客户端和服务器。这里的客户端用于从 GraphQL 服务器获取数据,服务器用于为 GraphQL 客户端创建 API。


26) 你对 GraphQL 中的变更 (Mutation) 有何了解?

变更 (Mutation) 是 GraphQL 中最重要的操作之一。当你想添加、删除和编辑数据时,它用于写操作。


27) GraphQL 中的订阅 (Subscription) 是什么?

在 GraphQL 中,订阅用于监听任何数据变化。当数据发生变化时,服务器会向客户端发送通知消息,前提是客户端订阅了该事件。


28) 你对 GraphQL 中的查询 (Query) 有何理解?

GraphQL 查询用于读取数据。它类似于我们在 REST API 中使用的 GET 请求。GraphQL 查询用于从 GraphQL 服务器检索数据。


29) 你对 GraphQL 中的字段 (Fields) 有何了解?

在 GraphQL 查询中使用的对象的键被称为字段。

例如

在上面的查询中,'name' 和 'salary' 是字段。


30) GraphQL 中的对象类型有什么用途?

客户端访问的资源称为对象。对象可以包含 GraphQL 字段列表。


31) GraphQL 中的接口 (Interface) 有什么用途?

在 GraphQL 中,接口用于列出 GraphQL 对象的公共字段。其他对象可以使用此接口继承属性。


32) GraphQL 中的联合 (Union) 是什么?

在 GraphQL 中,有时我们需要表示多个对象,因此使用了联合。用户可以使用联合定义一个以上的类型作为返回类型。


33) GraphQL 中枚举 (Enums) 的用途是什么?

GraphQL 中的枚举类型是一种特殊的标量类型,用于定义一个类型,包括允许值的列表。


34) GraphQL 中的解析器 (Resolver) 有什么用途?

在 GraphQL 中,解析器 (resolver) 用于处理查询并为 GraphQL 查询生成响应。


35) 你对 GraphQL 中的参数 (Arguments) 有何了解?

当我们想请求特定数据时,参数用于 GraphQL 查询和字段。

例如

在上面的查询中,'id' 是传递给 'employee' 的参数,用于返回 'name' 和 'salary',我们希望获取 'id' 等于 '001' 的特定数据。


36) 你对 GraphQL 中的非空类型修饰符 (Non-null type modifier) 有何了解?

在 GraphQL 中,非空类型修饰符用于将参数指定为非空值。如果你为非空参数传递 null,GraphQL 服务器将发送验证错误。感叹号“!”用于将参数标记为非空。


37) 你对 GraphQL 中的别名 (Aliases) 有何理解?

在 GraphQL 中,别名用于更改查询的字段名称。它允许你根据自己的需要重命名字段的结果。

例如

在上面的查询中,我们使用了别名来为两个“employees”使用不同的名称。如果没有别名,你将在结果中收到一个错误。


38) 你对 GraphQL 中的片段 (Fragment) 有何理解?

在 GraphQL 中,当查询非常大且包含可重用单元时,可以使用片段。你可以通过提取可重用部分来创建一个片段,并在查询中使用该片段。片段的概念旨在以简单的方式组织代码并避免重复代码。


39) 你对 GraphQL Voyager 有何理解?

GraphQL Voyager 是一个开源库,用于将任何 GraphQL API 表示为交互式图。


40) GraphQL 中的验证步骤有什么用途?

验证步骤是 GraphQL 中的一个关键步骤。它用于检查 GraphQL 查询的格式是否有效。如果它发现查询无效,则会在运行时检查之前通知客户端。


41) GraphQL 中的执行步骤有什么用途?

执行步骤用于在 GraphQL 中执行查询。此步骤在验证步骤之后执行。


42) Java、Python 和 JavaScript 的 GraphQL 库名称是什么?

Java、Python 和 JavaScript 的 GraphQL 库名称分别是 graphql-java、Graphene 和 express-graphql。

语言GraphQL 库名称
Javagraphql-java
PythonGraphene
JavaScriptexpress-graphql

43) 如何在线托管 GraphQL 服务器?

你可以使用任何编程语言,如 Node.js 或 Python 来创建 GraphQL 服务器,并像托管其他服务器一样托管它。


44) 你对 Apollo GraphQL 中的远程模式 (Remote Schemas) 有何了解?

远程模式用于创建指向单独的远程服务器的 GraphQL 模式对象。


45) Apollo 中的模式缝合 (Schema stitching) 有什么用途?

模式缝合用于将多个 GraphQL API 合并或组合成一个单一 API。