使用 GraphQL 构建强类型 API

GraphQL 是一种用于构建 API 的查询语言。它的主要特点是能够按需获取需要查询的数据,而不是像传统 REST API 那样将整个资源返回给客户端。此外,它还支持强类型的查询,使得开发者在编写代码时更安全,更容易查错。

在本文中,我们将介绍如何使用 GraphQL 构建强类型 API,以及一些在该过程中可能遇到的挑战和解决方法。

GraphQL 的基本概念

查询和类型

GraphQL 的查询是由一个或多个字段组成的树状结构。每个字段都有一个名称和一个类型。类型可以是标量(例如字符串、整数等)或自定义对象(例如用户、评论等)。自定义对象可以由多个字段组成,每个字段又可以是标量或另一个自定义对象。

例如,假设我们要查询一篇文章及其作者的名称:

----- -
  -------- ---- -
    -----
    ------ -
      ----
    -
  -
-

这个查询由两个字段组成:postauthorpost 是一个自定义对象,它有一个参数 id 和两个子字段 titleauthorauthor 又是另一个自定义对象,它有一个子字段 name

变量和参数

GraphQL 支持将查询中的某些值(例如查询参数)作为变量传递。这可以使查询可重用,并使客户端代码更清晰简洁。

例如,我们可以将上面的查询改写为:

-------------- ----- -
  -------- -------- -
    -----
    ------ -
      ----
    -
  -
-

这里我们定义了一个名为 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 参数查询一篇文章:

---- ----- -
  -------- ------ -----
-

客户端可以将参数 id 作为输入变量。例如,以下代码片段显示了如何定义变量:

----- ---------------- ----- -
  -------- -------- -
    --
    -----
    -------
    ------ -
      ----
    -
  -
-

3. 创建解析器

最后,您需要创建一个解析器,将 GraphQL 查询解释为后端代码,并提供结果。解析器必须实现每个字段的函数,这些函数将从数据库中检索数据并将其转换为适当的 GraphQL 类型。

以下是使用 Node.js 和 Express 框架的解析器示例:

----- ------- - -------------------
----- - ----------- - - ---------------------------
----- - ----------- - - -------------------
----- --- - ----------

-- ----
----- ------ - -------------
  ---- ----- -
    -------- ------ -----
  -

  ---- ---- -
    --- ----
    ------ -------
    -------- -------
    ------- -----
  -

  ---- ---- -
    --- ----
    ----- -------
    ------ -------
  -
---

-- -----
----- ---- - -
  ----- -- -- -- -- -
    ----- ---- - ------------------------ -- --------
    ------ -
      --- --------
      ------ -----------
      -------- -------------
      ------- ----------------------------------- -- --------
    --
  --
--

-- -- ------- --
--------
  -----------
  -------------
    -------
    ---------- -----
    --------- ----- -- -- ------- --- --
  --
--

-- -----
---------------- -- -- -
  ---------------------- -- ---- -------
---

总结

GraphQL 使得开发者可以按需获取数据,编写安全的代码,和自定义扩充功能。在构建 GraphQL API 时,定义类型,定义查询和变量,然后创建解析器,即可完成整个过程。GraphQL 具有许多优点,并且是一种高度灵活的 API 构建工具。因此,强烈建议开发人员在构建复杂的 API 时考虑使用 GraphQL。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64746ec6968c7c53b01ce824


猜你喜欢

  • 从详解 LESS 提高代码重用率

    随着前端技术日新月异的发展,我们的代码越来越多,重用率却越来越低,为了解决这个问题,我们可以引入 LESS 这样的 CSS 预处理器,它能够使我们的代码更易于维护和重用,提高我们的工作效率。

    1 年前
  • 如何在 Tailwind 中使用 SVG 图标实现更好的图形设计

    在前端开发中,图形设计是非常重要的一部分。而使用 SVG 图标可以为网站添加一些特别的图形元素,让网站更加生动和互动。Tailwind 是一个流行的前端框架,使用它来实现 SVG 图标设计是非常容易的...

    1 年前
  • Angular 中的依赖注入详解

    什么是依赖注入 Angular 是一个基于组件的前端开发框架,依赖注入(Dependency Injection,DI)是它的核心概念之一。 依赖注入能够简化组件之间的管理、调用和测试,它的本质是在运...

    1 年前
  • 如何使用 Fastify 实现 OAuth2.0 授权

    前言 在 web 应用程序的开发中,OAuth2.0 已经成为一种流行的协议,用于身份验证和授权。OAuth2.0 允许用户授权第三方应用程序访问其受保护的资源,而不需要将用户名和密码传递给该应用程序...

    1 年前
  • Mongoose 在使用 $pull 时遇到的问题及解决方式

    Mongoose 是基于 Node.js 平台的 MongoDB 驱动程序,它使得在 Node.js 中使用 MongoDB 更方便。在使用 Mongoose 中,$pull 是一个常用的操作,它可以...

    1 年前
  • ES10 提供更好的 Unicode 字符串支持方法

    在 ES10 中,JavaScript 提供了更好的 Unicode 字符串支持方法,这意味着我们可以更方便地使用 Unicode 字符串来处理文本。在本文中,我们将介绍 ES10 的这些新特性,并提...

    1 年前
  • 如何通过构建工具进行前端性能优化

    前端性能优化是提高网页性能的关键,尤其对于移动设备来说,更是至关重要。构建工具是前端性能优化的重要手段之一,通过使用不同的构建工具可以实现打包、压缩、懒加载等功能,有效地提高网页速度和性能。

    1 年前
  • 使用 Express.js 进行表单验证的步骤

    在前端开发中,表单验证是极其重要的一环。它能够有效地保证用户输入的安全和正确性,在提交表单数据前进行检查,将客户端的错误信息尽可能排除,使用户能够准确地输入信息,同时也能减少后端服务器的压力。

    1 年前
  • Node.js 中的安全问题及防范措施

    随着前端领域的不断发展,Node.js 已成为众多前端工程师必不可少的技术工具之一。虽然 Node.js 提供了许多便利的功能和优点,但同时也存在不少安全问题,如何防范 Node.js 的安全问题,已...

    1 年前
  • Mocha 使用多个模块测试异步操作

    对于前端开发人员而言,Mocha 是一款强大的测试框架,它可以帮助你创建和运行单元测试和集成测试,以确保你的代码质量和可靠性。在你的工作中,你可能需要测试异步操作。

    1 年前
  • 巧用 Sass,让你的 CSS 代码更易读、易维护!

    在 Web 开发中,CSS 是非常重要的一部分,它负责页面的样式和布局。然而,长期以来,CSS 的书写方式一直都很繁琐,很容易出错,而且不易于维护和更新。为了解决这个问题,Sass 应运而生。

    1 年前
  • ES8之async/await模式详解

    什么是async/await async和await是ES8(ECMAScript 2017)引入的新特性,是对Promise更高层次的抽象,能更方便地使用异步函数。

    1 年前
  • Material Design 中如何自定义 ToolBar 的颜色和高度?

    Material Design 是谷歌推出的设计语言,旨在为用户提供更加简洁、明了的使用体验。在 Material Design 中,Toolbar 是一个非常重要的组件,常常被用来作为页面顶部的导航...

    1 年前
  • CSS Grid 实现自适应布局的实用技巧

    什么是 CSS Grid? CSS Grid 是一种新的布局方式,是一种通过将子元素放置在网格中来构建网格布局的 CSS 模块。Grid 布局能够以一种简单、直观的方式,提供强大的布局能力,可以快速且...

    1 年前
  • MongoDB 如何进行跨表查询

    在 MongoDB 中进行跨表查询是一个非常常见的场景。本文将详细介绍 MongoDB 如何进行跨表查询,提供学习和指导意义。 跨表查询概述 在 MongoDB 中,跨表查询可以通过 $lookup ...

    1 年前
  • CSS Flexbox 实现水平垂直居中以及多行文本省略

    1. 什么是 Flexbox? CSS Flexbox(Flexible Box Layout Module)布局模块是一种用于在容器中对齐和分配空间的新方法。Flexbox 是一个一维布局模型,允许...

    1 年前
  • Redis 中如何解决缓存雪崩问题

    什么是缓存雪崩问题? 缓存雪崩问题是指在某个时间段,缓存中的大量数据同时失效或者大量请求命中缓存,导致瞬间大量请求都打到了数据库上,使得数据库承受不了这样的压力,直接宕机或响应时间变慢等问题,从而影响...

    1 年前
  • Vue.js 中 mixin 混入的使用方法

    在 Vue.js 开发中,我们可能会有一些可重用的逻辑,比如组件的生命周期方法、数据处理逻辑等。这些逻辑有时候需要被多个组件使用,如果每个组件都写一遍代码,就会造成代码冗余和维护困难。

    1 年前
  • Next.js 9.3.x 静态页面生成器探究

    Next.js 是一个 React 框架,已成为最流行的 React 应用程序框架之一。 在 Next.js 9.3.x 版本中,加入了静态页面生成器的功能,让 Next.js 能够比其他静态网站生成...

    1 年前
  • Kubernetes 中 Volume 的使用和配置

    前言 在 Kubernetes 集群环境中,容器的持久化存储是一个非常重要的方面。而 Kubernetes 中的 Volume 就是用于解决容器持久化存储的问题。本文将详细介绍 Kubernetes ...

    1 年前

相关推荐

    暂无文章