REST API (Representational State Transfer API) 毫无疑问是目前前端应用程序最流行的数据交换协议。REST API 可以使我们构建可伸缩的、可维护的 Web 应用程序。然而,在不同的应用程序生命周期中,REST API 可能会存在一些问题,尤其是在应用程序开始发展时,REST API 的一些缺点会变得非常明显。GraphQL 提供了一种弥补这些缺陷的新型解决方案,它可以更好地处理 API 的结构和复杂度。在本文中,我们将探讨如何优雅地从 REST API 迁移到 GraphQL。
REST API 的缺陷
REST API 目前存在一些缺陷,尤其是在应用程序开始变得复杂时。主要的缺陷有:
- API 端点过多:REST API 在创建多对多的关系时需要创建许多 API 端点。API 端点的数量很容易爆炸式增长。
- 过度获取:REST API 通常返回完整的资源对象,在客户端需要的情况下捕获很多不必要的数据。这可能会带来显著的性能问题,尤其是在缓存key的情况下。
- 多次请求:REST API 不支持在单个请求中检索多个资源和子资源,这可能导致文章、评论和其他资源的瀑布式加载延迟。
- 缺少灵活性:REST API 有明确定义的端点和请求和响应数据的格式。这使得它很难适应某些应用程序的需要。
这些问题可能会导致性能下降、管理 API 的难度升高,并带来其他问题。因此,GraphQL 已经成为许多开发人员解决这个问题的首选方案。
GraphQL 的优点
GraphQL 是一个新兴的 API 数据查询语言和运行时,它由 Facebook 发布。在 GraphQL 和 REST API 之间进行比较,GraphQL 有很多有点:
- 单个入口: GraphQL 可以通过一个入口点检索多个资源和子资源。这样做可以避免过度获取等性能问题。
- 灵活性: GraphQL 可以提供基于请求的数据的形式,请求的所需数据可以在运行时建模和提供。
- 探索性: 由于没有端点和请求和响应数据的明确格式,因此探索 GraphQL API 变得非常容易。
- 声明式数据:GraphQL查询定义了可以从API中检索的数据的结构。你可以把它看作是字段选项语句的树形结构,它表现了API可能提供的字段。当客户端向服务端发送查询时,它会遍历查询树,在树中选择指定的字段,这是在一次请求中发生的。这种声明性方法有助于减少与查询结果构造相关的逻辑复杂性。
- 前端驱动:GraphQL有利于前端工程师。例如,前端开发可以根据UI层次结构定义它们的查询。然后,他们可以调整它们的查询以符合API要求。这意味着,前端工程师可以拥有最终的说话权,而不是需要和 API 后台开发沟通和协商每一个接口。
这些都使得 GraphQL 成为现代化应用程序开发的绝佳选择。
如何将 REST API 迁移到 GraphQL
当数据需求变得比表格或线框图中显示的更大或更复杂时,过渡到 GraphQL 可以是很好的选择。要进行此迁移,可以遵循以下步骤:
步骤1: 创建 GraphQL schema
GraphQL schema 是 GraphQL API 可用的 schema。它描述了所有查询和变量。在开发时,schema 可以通过代码定义。 GraphQL schema 骨架看起来像这样:
-- -------------------- ---- ------- ------ - ------ ----- --------- -------- - ---- ----- - - ------ --- ------ --- ---- --- --- ---------- - ---- -------- - - ------ --- --- ------ --- ---- --- --- ------------ -
步骤2: 定义 resolver 函数
为了完全寻址和查询多个资源,你需要定义其他来解析其他子资源的 resolver:
-- -------------------- ---- ------- ----- --------- - - ------ - ------- -------- ----- -- - ------ ------------------------ -- -- ------- - ------ -------- -- - ------ ----------- --------- --------- -- - - -
步骤3: 编写 GraphQL API
要在 Node.js 中将 GraphQL 添加到现有的应用程序中,请使用 Apollo Server。
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------ ----- -------- - ---- ---- ------ - --- --- ----- ------- ------ -------- - ---- ---- - --- --- ------ ------- ------- ------- - ---- ----- - ---------- ------ ------- -------- ------ ----- - - ----- ------- - - -- - --- -- ----- ----- -------- -- -- - --- -- ----- ------- -------- -- -- ----- ----- - - -- - --- -- ------ ------ ------ --- --- ------------- ------- --------- - -- -- - --- -- ------ ------ ------ --- --- ------- -- --------- --------- - -- -- - --- -- ------ ------ ------ --- --- -------- -- --------- --------- - -- -- - --- -- ------ ---- ---- -- --- ------ --- ---------- -- --- ------ --------- - -- -- - --- -- ------ ---- ---- -- --- ------ --- --- -------- --------- - -- -- - --- -- ------ ---- ---- -- --- ------ --- ------ -- --- ------ --------- - -- -- ----- --------- - - ------ - ------- -------- - -- -- -- ------------ ----- -------- - -- -- -- ---------- -- ----- - ------- ------ -- ----------------------- -- ------- - ------ -------- -- - ------ ---------------------------------- -- ------------- --- ----------- -- -- -- ----- ------ - --- -------------- --------- --------- --- ----------------------- --- -- -- - ------------------- ----- -- --------- ---
步骤4: 迁移数据和查询
你必须迁移你的现有数据,可以通过 GraphQL 在 REST API 上执行查询来解决这个问题。 例如,对于一个独立的 RESTURL:
fetch('/api/users') .then(response => response.json()) .then(data => console.log(data))
下面是一个步骤4的GraphQL查询
-- -------------------- ---- ------- ----- - ----- - -- ---- ----- ----- - ----- - - -
这个查询将返回一个包含每个用户的 ID、姓名、电子邮件和名为 posts 的一个嵌套查询,其中包含所有发布到他们的文章的名字。
示例代码
请参见下列代码,这是使用 Apollo Server 的 GraphQL API。
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------- -- ---- ---- ---- ----- ----- - - - --- ---- ----- ----- ----- ------ - - ------ -------- -- ------- -------------- -------- ----- ---- ------ -- - ------ ---- ---- -- --------------- -------- ----- ---- ------ -- -- -- - --- ---- ----- ----- ------- ------ - - ------ --------- --- -------- -------- -------- ----- ---- ------ -- - ------ ---- -- -- --- --- -------- -------- ----- ---- ------ -- -- -- -- -- ------ ------ ----- -------- - ---- ---- ---- - --- --- ----- ------- ------ -------- - ---- ---- - ------ ------- -------- ------- - ---- ----- - -------- ----- ---- - -- -- ------ --------- ----- --------- - - ------ - ----- --- - -- -- -- - ------ --------------- -- ------- --- ---- -- -- ----- - ------ ------ -- - ------ --------------------- -- -- ------ ----------- -------- ------------- ---- -- -- -- -- ----- ------ ----- ------ - --- -------------- --------- --------- --- ----------------------- --- -- -- - ------------------- ----- -- --------- ---
结论
GraphQL 为大型应用程序提供了一种优雅、灵活的方式,使开发人员能够在客户端看到所需的内容。 GraphQL 不会在你的代码中强制出现逻辑混乱或冗余,因为它自带了适合自己的新工具和特性。因此,如果你需要在客户端提高性能和可维护性,强烈建议您开始考虑使用 GraphQL API。
总之,这将是一项繁琐的任务,需要开发人员协作,以创建一个能够满足现代应用程序所需的 API 服务。请确保您为每个端点和查询以及相应的Resolver编写足够的单元测试,这样你可以保证你的 API 在运行时正确地工作且健壮。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67526a9e8bd460d3ad9406ae