在现代 Web 应用中,后端 API 是连接前端和业务数据的关键组成部分。而在构建具有高效、灵活、可扩展性的 API 的同时,开发者需要考虑 API 的实现和设计、数据格式和传输以及安全和权限控制等方面。
目前,RESTful API 是最为流行和广泛应用的 API 设计风格,其使用 HTTP 协议同时利用 URL、HTTP 方法和请求体等组件描述和传输资源数据。然而,RESTful API 存在一些缺点,如调用多个 API 增加请求延迟、数据传输过多和某些情况下不够灵活等。
与传统的 RESTful API 相比,GraphQL API 更加灵活和高效。GraphQL 是一种用于 API 设计的查询语言,它允许客户端在一个请求中明确地告诉服务器需要哪些数据。GraphQL 可以减少请求次数、传输数据中不必要的信息以及通过解构(deconstruct)查询结果从而重用前端的组件。
本文将介绍如何使用 Hapi.js 和 GraphQL 来实现一个灵活、高效、安全和可扩展的 Web API。
Hapi.js 简介
在开始介绍 Hapi.js 和 GraphQL 结合使用之前,先让我们对 Hapi.js 有一个简单的了解。
Hapi.js 是一个基于 Node.js 的 Web 应用程序框架,它提供了一系列功能和工具,方便开发者构建高效和可维护的 Web 应用。
Hapi.js 的主要特点包括:
- 提供插件化的开发体验,方便组织和扩展应用程序。
- 安全可靠的路由映射,支持多种请求方式。
- 可定制的配置系统,支持多种部署环境。
- 多样化的请求处理,支持多种数据格式和文件上传。
- 扩展性强的错误处理和日志记录,方便排查和修复问题。
- 支持全面的测试驱动开发(TDD)和行为驱动开发(BDD)。
Hapi.js 提供了强大的可扩展和自定义的能力,可以满足各种特定需求的应用场景。
GraphQL 简介
GraphQL 是一个用于 API 设计的查询语言和运行时。它由 Facebook 开发并开源,可方便地与各种后端语言和框架集成。
GraphQL 的主要特点包括:
- 强类型系统,可以明确定义数据类型和请求参数,并且自动生成 API 文档。
- 查询语句可精确获取所需的数据,减少不必要的数据传输和请求次数。
- 可以定义多种查询、变量和片段,并且支持嵌套查询和类型扩展。
- 可以通过运行时协商(runtime negotiation)确定客户端所需的数据格式和版本。
- 可以支持多种数据源,包括数据库、外部 RESTful API 和自定义数据源等。
- 可以通过中间件和插件扩展 GraphQL 和适配其他应用框架。
与 RESTful API 相比,GraphQL 更加灵活和高效,尤其适用于需求变更频繁和客户端需要多份数据的场景。
Hapi.js 和 GraphQL 结合实现
在 Hapi.js 和 GraphQL 结合实现之前,先让我们简单介绍一下 GraphQL API 设计的基本要素。
Schema
Schema 是 GraphQL API 中最重要的一部分,它定义了 API 的类型、查询、变量和指令等元素。Schema 用来描述客户端可以查询的数据类型、数据字段和方法,以及如何执行查询。Schema 由类型(Type)、查询(Query)、变量(Mutation)和订阅(Subscription)四个部分组成。
Resolver
Resolver 是 GraphQL API 中用来处理查询请求的模块。Resolver 将查询请求映射到底层数据源或服务,并返回查询结果。
在 Hapi.js 中,可以使用 hapi-graphql 插件来将 GraphQL 集成到 Web 应用程序中。使用 hapi-graphql 插件,可以轻松地创建 GraphQL API 和整合其他 Hapi.js 插件。
下面是使用 Hapi.js 和 GraphQL 来构建一个 Web API 的流程。
步骤 1:安装依赖
首先,可以使用以下命令安装 Hapi.js 和 GraphQL 的依赖。
npm install hapi graphql hapi-graphql graphql-tools
步骤 2:定义 Schema
下一步是定义 Schema。在本例中,我们将使用 GraphQL SDL(Schema Definition Language)来定义 Schema。这里我们创建一个 User 类型,其中包含了用户的姓名和年龄。然后,我们将 Query 类型与一个名为 getUser
的 Resolver 关联。
type User { name: String! age: Int! } type Query { getUser(name: String!): User! }
步骤 3:创建 Resolver
现在,我们需要创建 Resolver 来处理查询请求。在本例中,我们将使用一个普通的 JavaScript 模块来创建 Resolver。
-- -------------------- ---- ------- -------------- - - -------- ------ ----- -------- ----- -- - ----- - ---- - - ----- ----- ----- - - - ----- -------- ---- -- -- - ----- ------ ---- -- -- - ----- ---------- ---- -- -- -- ------ ----------------- -- --------- --- ------ -- --
上面的 Resolver 接受一个参数 name
,然后在一个伪造的用户列表中查找这个用户并返回它的信息。
步骤 4:创建 Hapi.js 服务器
接下来,我们需要创建一个 Hapi.js 服务器来托管我们的 GraphQL API。我们需要将 User 类型和 Resolver 关联起来,然后将其传递给 hapi-graphql 插件。
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- - -------------------- - - --------------------------------- ----- - ----------- - - ------------------------------ ----- --------- - ----------------------- ----- -------- - - ---- ---- - ----- ------- ---- ---- - ---- ----- - ------------- --------- ----- - -- ----- ------ - ---------------------- --------- --------- --- ----- ------ - --- ------------- ----- ----- ----- ------------ --- ----------------- ------- ------------ -------- - ----- ----------- --------------- - ------- -- ------ - ----- ----- -- -- ---
在上面的代码中,我们将 typeDefs 和 Resolvers 组合成一个可执行的 Schema(executable schema),然后传递给 graphqlHapi 插件。在插件选项中,我们将 API 路由设置为 /graphql
,并使用 cors
来允许客户端访问 API。
步骤 5:运行 GraphQL API
最后,我们可以通过执行以下命令来启动带有 GraphQL API 的 Hapi.js 服务器。
server.start();
步骤 6:执行 GraphQL 查询
现在,可以使用 GraphiQL 或其他 GraphQL 客户端工具来测试和执行查询。例如,如果想要获取用户 Alice 的信息:
query { getUser(name: "Alice") { name age } }
步骤 7:实现预处理器和后处理器
在 Hapi.js 中,可以使用预处理器和后处理器来扩展和优化 GraphQL API。预处理器用于在请求到达 Resolver 之前对请求进行处理,而后处理器用于在 Resolver 返回结果之后对结果进行处理。
下面是一个预处理器的例子,它用于实现权限控制。
const checkAuthorization = (request, reply, done) => { const { headers } = request; if (headers.authorization && headers.authorization === 'Bearer token') { done(null); } else { done(new Error('Unauthorized')); } };
步骤 8:使用插件
Hapi.js 提供了多种插件来扩展和优化 GraphQL API。例如,可以使用 hapi-graphql-auth 来实现授权和身份验证,使用 hapi-graphql-validate 来进行数据验证和转换,使用 hapi-graphql-logger 来记录查询日志等等。
-- -------------------- ---- ------- ----------------- ------- ----------------------------- -------- - ----- - --------- ------ -- --------- ----- --------- -------- ------ -- - ----- - ---- - - -------- ----- -------------- - ------------------------------------ ----- ------------ - ----- ------------------------ --- ------- --- ----- ----------- - ------------ -- ----------------- --- ---------- ------ - -------- ------------ ------------ ----- -- -- -- ---
总结
在本文中,我们介绍了 Hapi.js 和 GraphQL 在 Web API 开发中的应用,以及其基本要素和工具。Hapi.js 是一个灵活、可扩展、安全和可配置的 Web 应用程序框架,而 GraphQL 是一个灵活、高效和可扩展的 API 设计和运行时。两者结合使用可以实现更高效和灵活的 Web API。通过本文的示例和导引,希望读者可以更深入地了解 Hapi.js 和 GraphQL 的使用方法和优势,并在实际应用中得到实践和应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645308c4968c7c53b077bc97