GraphQL 是一种用于构建 API 的查询语言。它的主要特点是能够按需获取需要查询的数据,而不是像传统 REST API 那样将整个资源返回给客户端。此外,它还支持强类型的查询,使得开发者在编写代码时更安全,更容易查错。
在本文中,我们将介绍如何使用 GraphQL 构建强类型 API,以及一些在该过程中可能遇到的挑战和解决方法。
GraphQL 的基本概念
查询和类型
GraphQL 的查询是由一个或多个字段组成的树状结构。每个字段都有一个名称和一个类型。类型可以是标量(例如字符串、整数等)或自定义对象(例如用户、评论等)。自定义对象可以由多个字段组成,每个字段又可以是标量或另一个自定义对象。
例如,假设我们要查询一篇文章及其作者的名称:
query { post(id: 123) { title author { name } } }
这个查询由两个字段组成:post
和 author
。post
是一个自定义对象,它有一个参数 id
和两个子字段 title
和 author
。author
又是另一个自定义对象,它有一个子字段 name
。
变量和参数
GraphQL 支持将查询中的某些值(例如查询参数)作为变量传递。这可以使查询可重用,并使客户端代码更清晰简洁。
例如,我们可以将上面的查询改写为:
query($postId: Int!) { post(id: $postId) { title author { name } } }
这里我们定义了一个名为 postId
的变量,并将它的类型指定为整数。在查询中,我们使用 $postId
来引用这个变量。
端点和响应
GraphQL 定义了一些标准的端点(例如 /graphql
),客户端可以向这些端点发送查询请求。查询响应是一个 JSON 对象,其中包含了客户端请求的字段和值。如果在查询过程中出现了错误,响应中会包含错误信息。
以下是一个示例响应:
-- -------------------- ---- ------- - ------- - ------- - -------- -------- ----- ---------- --------- - ------- ----- ---- - - - -
GraphQL 的优点
与传统 REST API 相比,GraphQL 具有以下优点:
可按需获取的数据
使用 GraphQL,客户端可以仅获取需要的字段,而不是整个资源。这大大减少了不必要的带宽消耗和数据延迟。此外,此方法还有助于将客户端与后端解耦,并使 API 更具可扩展性。
强类型的查询
GraphQL 支持强类型的查询,这使得开发人员能够在编写代码时更安全,更容易调试。例如,如果您想查询一个不存在的字段,GraphQL 将在编译时捕获该错误,而不是等到运行时才抛出错误。
可编程的架构
GraphQL 没有像 REST API 那样的刚性结构。因此,使用 GraphQL,开发人员可以更轻松地根据具体需要构建 API,并在 API 中添加新功能。此外,GraphQL 还支持自定义指令,使得开发者能够根据自己的需要添加自定义行为。
如何使用 GraphQL 构建 API
使用 GraphQL 构建 API 的过程分为以下几个步骤:
1. 定义类型
首先,您需要定义 API 上的所有类型。这些类型可以是标量或自定义对象。例如,以下代码片段显示了如何定义一个 Post 类型:
-- -------------------- ---- ------- ---- ---- - --- ---- ------ ------- -------- ------- ------- ----- - ---- ---- - --- ---- ----- ------- ------ ------- -
这个 Post 类型包含了一个整数型的 id 字段、一个字符串型的 title 字段、一个字符串型的 content 字段和一个用户型的 author 字段。User 类型同理。
2. 定义查询和变量
接下来,您需要定义您希望客户端能够查询的字段。例如,以下代码片段定义了一个查询名为 post
,客户端可以通过其 id 参数查询一篇文章:
type Query { post(id: Int!): Post! }
客户端可以将参数 id
作为输入变量。例如,以下代码片段显示了如何定义变量:
-- -------------------- ---- ------- ----- ---------------- ----- - -------- -------- - -- ----- ------- ------ - ---- - - -
3. 创建解析器
最后,您需要创建一个解析器,将 GraphQL 查询解释为后端代码,并提供结果。解析器必须实现每个字段的函数,这些函数将从数据库中检索数据并将其转换为适当的 GraphQL 类型。
以下是使用 Node.js 和 Express 框架的解析器示例:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- - ----------- - - ------------------- ----- --- - ---------- -- ---- ----- ------ - ------------- ---- ----- - -------- ------ ----- - ---- ---- - --- ---- ------ ------- -------- ------- ------- ----- - ---- ---- - --- ---- ----- ------- ------ ------- - --- -- ----- ----- ---- - - ----- -- -- -- -- - ----- ---- - ------------------------ -- -------- ------ - --- -------- ------ ----------- -------- ------------- ------- ----------------------------------- -- -------- -- -- -- -- -- ------- -- -------- ----------- ------------- ------- ---------- ----- --------- ----- -- -- ------- --- -- -- -- -- ----- ---------------- -- -- - ---------------------- -- ---- ------- ---
总结
GraphQL 使得开发者可以按需获取数据,编写安全的代码,和自定义扩充功能。在构建 GraphQL API 时,定义类型,定义查询和变量,然后创建解析器,即可完成整个过程。GraphQL 具有许多优点,并且是一种高度灵活的 API 构建工具。因此,强烈建议开发人员在构建复杂的 API 时考虑使用 GraphQL。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64746ec6968c7c53b01ce824