随着 Web 应用的不断发展,前后端分离技术也越来越成熟,RESTful API 在 Web 开发中已经成为了最流行的 API 设计风格之一。然而,RESTful API 还存在一些比较麻烦的问题,例如:过度获取数据、多次请求以获得所需数据以及文档缺乏自描述等。因此,人们开始寻求其他更好的实现方案。GraphQL 就是一种解决方案。
GraphQL 是一种新的 API 查询语言,它采用 GraphQL 语言进行查询,返回精确的数据结果。GraphQL 是由 Facebook 开发的,它的目的是为了解决 RESTful API 难以解决的一些问题。GraphQL 将数据作为图形数据模型处理,以便可以查看数据之间的关系,并且允许客户端指定需要的数据。
在本文中,我们将探讨如何使用 GraphQL 创建 Web API,并提供一些实用的技巧以及最佳实践。
如何创建 GraphQL API
首先,我们需要安装一个 GraphQL 服务器,我们在这里选择最受欢迎的 Apollo Server。
在项目中,我们需要遵循以下步骤:
Step 1:定义模式
使用 GraphQL,模式定义是 API 的重要组件之一。模式是一个图形,用于描述可用数据的形状和类型。GraphQL 使用类型声明来确保我们的 API 返回正确类型的数据。
-- -------------------- ---- ------- ---- ----- - -------- ------ ---- - ---- ---- - --- ---- ----- ------- ------ ------- ------ ------ - ---- ---- - --- ---- ------ ------- ----- ------- -展开代码
在上面的示例中,我们定义了三个类型:Query
、User
和 Post
。Query
作为根类型,它包含所有可查询的字段。在 User
和 Post
中,我们定义了这些对象的属性,例如 id
、name
等。
Step 2:编写解析器
在定义了模式之后,我们需要编写与模式匹配的解析器来实现我们的 Web API。我们可以使用 JavaScript 来编写我们的解析器。
-- -------------------- ---- ------- ----- --------- - - ------ - ----- ------ - -- -- -------- ----- -- - ------ ---------------------- - -- ----- - ------ ------ -- - ------ ---------------- ------- ------- -- - - --展开代码
在上面的代码中,我们先定义了 resolvers
对象,里面包含了两个属性。Query
对象的 user
属性是一个函数,它接受四个参数,分别是请求的根对象、参数、上下文对象和信息对象。代码中,我们使用了 Mongoose(一个 Node.js 的 MongoDB 数据库驱动程序)来查找用户信息。
User
对象的 posts
属性也是一个函数,它接受一个用户对象作为参数,并返回与该用户相关的所有帖子。这里我们同样使用 Mongoose 查找 ObjectId 为其所属用户的所有帖子。
Step 3:启动服务器
完成了前两步,我们可以使用 Apollo Server 框架将我们的解析器与模式组合起来,以便最终创建 GraphQL API 服务器。
const server = new ApolloServer({ typeDefs, resolvers }); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); });
这个服务器可以运行在任何 Node.js 环境中,并提供了基本的错误处理和调试功能。
一些最佳实践
接下来,我们提供一些关于使用 GraphQL 的实用技巧:
分页
对于一个大型数据集,很少有情况下一次性返回一个结果集是最佳选择。GraphQL 使用游标分页(Cursor-based Pagination,CBP)来更好地支持大型数据集的分页。游标分页是一种从数据集的指定位置(游标)开始逐步查找项的 API。您可以通过传递游标参数和设置每页项目数来控制分页大小。
-- -------------------- ---- ------- ---- ----- - ------------ ----- ------ ------- ----- ---- ------- -------- --------------- - ---- -------------- - ------ ------------ --------- --------- - ---- -------- - ------- ------- ----- ----- - ---- -------- - ---------------- -------- ------------ -------- ------------ ------- ---------- ------- - ------ ------展开代码
在上述示例中,users
的查询包含了 first
推荐列表,after
游标标记,last
倒序列表,before
反向游标标记,UserConnection
包含了查询结果的列表,PageInfo
用于描述当前查询页面的信息,定义了查询结果的元数据。要使用游标分页,确保指定默认分页大小,并使用每页最大大小的限制。
安全
在使用 GraphQL 构建 API 时,为确保安全,请将操作限制为安全数据库操作,例如查询并附加、仅列出单个请求之类的权限级别。通过控制哪些字段被返回,您可以实现对包含敏感信息(例如用户密码或安全配置)的对象的保护。
性能
在设计 GraphQL API 时,我们能够编写数据查询语句,以便仅返回在客户端需要的数据。这可以有效地提高性能,减少 API 响应时间。
缓存
在处理查询之前,请先检查给定查询是否已被缓存。如果查询已缓存,则我们可以从缓存中获取结果而无需重新评估查询。
结论
在本文中,我们介绍了如何使用 GraphQL 创建 Web API,包括定义模式、编写解析器和启动服务器。我们还提供了一些最佳实践和实用技巧,以确保我们的 API 安全、高效和可扩展。
虽然 GraphQL 相对较新,但它已经被越来越多的企业和 Web 开发人员接受,并成为了一个流行的选择。如果您是一名前端开发人员,那么学习并使用 GraphQL 将使您更具备竞争力,并开发出更优秀的 Web 应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676d485482fcee791c6672d3