从REST到GraphQL:为什么以及我是如何完成转型的

2025/1/3 23:05:28

本文主要是介绍从REST到GraphQL:为什么以及我是如何完成转型的,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

作为一名拥有4年以上经验的软件工程师,我从事过构建REST API的工作,一直都很欣赏REST带来的简洁性和可靠性。无论是设计接口还是结构化响应,REST一直是我的首选方案。

但今年年初,一切都变了。我被指派接手一个项目,该项目需要处理海量、复杂且相互关联的数据源。这不仅仅是获取用户列表或更新单条记录那么简单,而是需要在REST难以达到的规模上具备灵活性、精准度和效率。

让我们来看看 GraphQL。📌

最开始,我有点怀疑。为什么要修还没坏的东西呢?但当我深入了解后,GraphQL 不仅满足了项目需求,还改变了我对 API 的看法。通过其功能:

  • 返回客户端定义的灵活结构的数据,
  • 通过一个单一的URL端点来操作,
  • 根据强类型模式拒绝无效请求,
  • 以双方都认可的预定义格式提供数据,

GraphQL很快地不仅仅是一个解决方法——它成为了我设计API的新准则。

总而言之,这篇文章的目的不是为了推崇 GraphQL 而贬低 REST API。实际上,我认为两者可以很好搭配使用。REST 在我的项目中仍然扮演着重要角色,尤其是在某些特定情况下,使用专门的 REST 接口比 GraphQL 查询更为实际有效。

在这篇文章里,我要分享

  1. 为什么我从 REST 转向了 GraphQL
  2. 我亲身感受到的好处,以及
  3. 一份简单的指南帮助你搭建第一个 GraphQL 服务器。

无论你是对 GraphQL 感兴趣的新手,还是希望转向 GraphQL 的有经验的工程师,本文都会向你展示为什么 GraphQL 是值得关注的,以及它如何在不完全替代 REST 的情况下改变你的项目。

从REST到GraphQL的我的旅程

多年来,REST API 一直是我的主要收入来源和工作重心。我依赖它们来构建强大的系统、管理数据并实现功能。但随着项目的不断复杂化,这些问题开始显现。
惊讶

RESTful API的挑战

经常遇到的问题是过度获取和不足获取数据。有时我会获取到太多不需要的信息,有时又不得不多次请求才能获取所需。管理这些端点增加了工作量,使得更新和维护变得很繁琐。

探索一下 GraphQL

今年早些时候,我加入了一个需要处理大型且相互关联的数据集的项目。REST 已经不够用了,团队推荐使用 GraphQL。一开始我还有点怀疑,但能从一个端点精准查询所需数据的想法让我挺感兴趣。

关于GraphQL的第一印象

从开始使用 GraphQL 并非没有挑战。模式和解析器起初让我感到有些棘手,但它的灵活性和控制力让这一切努力变得值得。渐渐地,我渐渐意识到它无缝地解决了我在使用 REST 时遇到的问题。

虽然我仍然在特定情况下使用REST,但我更喜欢使用GraphQL来处理复杂和动态的数据需求。

切换

我为什么选择转变

当我深入了解 GraphQL 时,几个关键优势变得明显,使得这一转变变得自然而然:

  • 灵活度: 使用 GraphQL,我可以精确获取所需的数据——不多也不少。再也不用处理多个端点或过度获取数据的问题了。
  • 效率: 单个查询可以替代多个 REST API 调用,提高了性能。这对涉及复杂且相互关联数据的应用程序特别有效。
  • 开发者体验: 强类型的数据、内省特性和更好的调试工具使开发更加顺畅且减少了错误的发生。
  • 生态系统和社区支持: 比如 Apollo Client 和其他 GraphQL 工具极大地丰富了体验,使学习和整合 GraphQL 更加容易。

我如何完成转型

旅程充满挑战,但这样分解成步骤让过渡变得容易处理。

第一步:了解GraphQL基础知识

我先从学习核心概念入手:

  • 查询 用于获取数据。
  • 修改 用于修改数据。
  • 解析器(Resolvers) 用于连接模式定义与实际数据源。

对我搭建第一个 GraphQL 服务器非常重要的是这种基础知识。

第二步:搭建我的第一个GraphQL服务器

为了亲自动手,我用Node.js和Apollo Server搭建了一个简单的服务器。过程是这样的:

  1. 创建一个 Node.js 项目: 并初始化项目使用 npm init,添加必要的依赖。
  2. 安装 GraphQL 依赖: 安装了 GraphQL 相关的 apollo-servergraphql
  3. 编写基本的模式和解析器: 定义了描述数据的模式,并编写了用于获取数据的解析器。
  4. 运行服务器: 启动服务器并用 GraphQL 进行了查询测试。

第一次看到它运作真是太激动人心了🎉,这感觉一切都没白费。

第三步:将现有REST API过渡

下一步就是把GraphQL加到现有的REST项目中去,我采取了逐步推进的方式。

  1. 确定了需要替换为 GraphQL 查询或变异的关键 REST 接口。
  2. 构建了相应的 GraphQL 模式和解析器。
  3. 在过渡期间维护 REST 接口以确保稳定性。

这种混合方法让我能够逐步引入GraphQL,而不影响现有功能。

快速上手指南:搭建你的第一个 GraphQL 服务器

开始使用 GraphQL 比想象的要简单得多。下面是一份快速指南,使用 Node.js 和 Apollo Server 来搭建一个基本的服务器:

第一步:安装所需依赖

首先,创建一个Node.js项目,并安装所需的软件包:

npm init -y  
npm install apollo-server graphql  <!-- 运行npm命令初始化项目并安装Apollo Server和GraphQL依赖包 -->

点击此处全屏模式 点击此处退出全屏

步骤二:定义模式及其解析器

创建一个名为 index.js 的文件,并在其中加入以下代码:

    const { ApolloServer, gql } = require('apollo-server');  

    // 模拟的用户数据  
    const users = [  
      { id: '1', name: 'John Doe', email: 'john@example.com' },  
      { id: '2', name: 'Jane Smith', email: 'jane@example.com' },  
      { id: '3', name: 'Alice Johnson', email: 'alice@example.com' },  
    ];  

    // 模式定义  
    const typeDefs = gql`  
      type User {  
        id: ID  
        name: String  
        email: String  
      }  

      type Query {  
        users: [User]  
        user(id: ID!): User  
      }  
    `;  

    // 解析器定义  
    const resolvers = {  
      Query: {  
        users: () => users,  
        user: (_, { id }) => users.find((user) => user.id === id),  
      },  
    };  

    // 创建服务器  
    const server = new ApolloServer({ typeDefs, resolvers });  

    // 服务器启动  
    server.listen().then(({ url }) => {  
      console.log(`&#128640; 服务器已启动并运行在 ${url}`);  
    });  

全屏查看。退出全屏。

第三步:运行服务器并进行测试

启动服务器:

    node index.js  # 运行主文件

全屏切换,进入全屏/退出全屏

在您的浏览器或如 GraphQL 之类的工具中打开提供的网址,并测试查询。

查看所有用户信息:

查询:  
{  
  用户 {  
    id  
    名字  
    电子邮件  
  }  
}  

进入全屏模式,或退出全屏模式

通过ID查询单个用户

{  
  query {  
    user(id: "1") {  
      名字  
      电子邮件  
    }  
  }  
}  

全屏模式 退出全屏

开心
庆祝&#127881;&#127881; 你刚刚创建了自己的第一个 GraphQL 服务器!

学到的

切换到 GraphQL 后,这让我学到了宝贵的知识和经验:

做得好的事情

  • 这样的转换显著提高了数据获取的效率。数据获取不足或过量的问题再也不会出现了!
  • 强类型的模式定义减少了运行时的错误,并使调试变得更加简单。
  • 生态系统中的工具,例如 Apollo Client,提高了开发人员的效率。

我会怎样做得不一样

  • 逐步学习: 我一次性投入整个项目,可能会感到压力山大。分阶段进行,先专注于查询和变异会更加顺畅。
  • 从小开始: 我可以从替换一个 REST 端点做起,逐渐熟悉 GraphQL 的工作流程。

给别人的建议

  • 别完全放弃REST: REST和GraphQL可以共存。用REST处理简单的操作,用GraphQL来处理复杂且相互关联的数据需求。
  • 利用社区资源: GraphQL有一个活跃的社区和很多优秀的资源。有问题别犹豫向别人求助,也可以从别人的经验中学到很多。

迁移到 GraphQL 不仅仅是更换工具——更重要的是重新思考如何与数据打交道。从小开始,尝试实验,享受这段旅程!

REST 和 GraphQL:快速对比

在选择REST和GraphQL时,了解它们的关键区别可以为你在项目中的选择提供帮助。这里简单总结一下:

特性 REST API GraphQL
数据抓取 固定的数据结构,端点可能会造成过度获取或获取不足。 灵活查询,精准获取所需数据。
端点管理 不同资源对应多个端点。 所有查询和变异使用单个端点。
灵活性 灵活性有限,特定数据需求需要自定义端点。 高度灵活,客户端指定数据需求。
类型安全 依赖文档,无内置类型强制。 强类型模式确保数据的一致性和可预测性。
错误处理 自定义错误格式,跨API不统一。 从模式验证中提供标准化错误响应。
工具支持 工具多样,通常针对特定端点设计。 丰富的生态系统,如Apollo、GraphQL和Relay。

尽管REST API可靠且广泛支持,但在需要复杂、相关数据和灵活性的场景中,GraphQL更为出色。
详细了解差异,请参阅我之前的文章

结论

从 REST 转到 GraphQL 对我来说是改变游戏规则的。这种灵活性、效率以及改进的开发体验让我的项目变得更加强大和易于扩展。不过,我坚信 REST API 和 GraphQL 可以共存,相辅相成,适用于不同的情况。

如果你正考虑切换到 GraphQL,我鼓励你从小规模开始,边实验边逐步集成 GraphQL 到你的技术栈中。这是一段值得一试的旅程,我很期待看到你如何让它成为你自己的东西。

开始入门资源

以下是一些帮助你了解 GraphQL 的工具和指南:

  • GraphQL 文档
  • Apollo Server 使用指南
  • GraphQL 实时编辑器

gif

Bentil 在这里 &#128640;
你从 REST 过渡到 GraphQL 了吗,或者正在考虑转向 GraphQL?在整个过程中你遇到了哪些挑战或收获?欢迎在下面的评论区分享你的想法、问题或经历。让我们一起学习和成长吧!&#128640;



这篇关于从REST到GraphQL:为什么以及我是如何完成转型的的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程