从 REST 到 GraphQL:我为何以及如何进行切换
作为一名拥有 4 年 REST API 构建经验的软件工程师,我一直很欣赏 REST 带来的简单性和可靠性。无论是设计端点还是构建响应,REST 都是我的首选解决方案。
但今年早些时候,一切都发生了变化。我的任务是跳到一个需要处理大型、复杂且相互关联的数据源的项目。这不仅仅是获取用户列表或更新单个记录,它需要灵活性、精确性和REST 难以提供的规模效率。
输入GraphQL。?
起初,我持怀疑态度。为什么要修复没有损坏的东西?但随着我深入研究,GraphQL 不仅满足了项目的需求,它还重新定义了我对 API 的看法。凭借其能力:
- 以客户端定义的灵活结构返回数据,
- 通过单个 URL 端点进行操作,
- 拒绝基于强类型架构的无效请求,以及
- 以预先确定的、相互理解的格式交付数据,
GraphQL 很快就不仅仅是一个解决方案,它成为我 API 设计的新标准。
也就是说,本文的目的是不是为了支持 GraphQL 而抹黑 REST API。事实上,我相信两者可以完美地相辅相成。 REST 在我的项目中仍然发挥着至关重要的作用,特别是对于专用 REST 端点比 GraphQL 查询更实用的特定用例。
在这篇文章中,我将分享:
- 为什么我从 REST 切换到 GraphQL,
- 我亲身体验过的好处,以及
- 简单指南帮助您构建第一个 GraphQL 服务器。
无论您是对 GraphQL 感到好奇的初学者,还是希望过渡的经验丰富的工程师,本文都将向您展示为什么 GraphQL 值得您关注,以及它如何在不完全取代 REST 的情况下改变您的项目。
我从 REST 到 GraphQL 的旅程
多年来,REST API 一直是我的面包和黄油。我依靠它们来构建强大的系统、管理数据和提供功能。但随着我的项目变得越来越复杂,裂缝开始出现。
REST API 的挑战
一个反复出现的挫败感是过度获取和获取不足的数据。我要么获得太多我不需要的信息,要么必须提出多个请求才能获得我所做的一切。管理大量端点增加了复杂性,使更新和维护变得繁琐。
发现 GraphQL
今年早些时候,我加入了一个需要使用大型互连数据源的项目。REST 无法满足要求,团队建议使用 GraphQL。最初,我对此表示怀疑,但从单个端点准确查询所需内容的承诺引起了我的兴趣。
GraphQL 的第一印象
从 GraphQL 开始并非没有挑战。模式和解析器让人望而生畏,但它提供的灵活性和控制使这些努力变得值得。随着时间的推移,我意识到它如何无缝地解决了我在 REST 方面面临的痛点。
虽然我仍然在特定情况下使用 REST,但 GraphQL 已成为我处理复杂和动态数据需求的首选工具。
为什么我要改变
当我更深入地研究 GraphQL 时,一些关键优势脱颖而出,使转换变得轻而易举:
- 灵活性:使用 GraphQL,我可以准确获取我需要的数据——不多也不少。不再需要处理多个端点或处理过度获取。
- 效率:单个查询可以替代多个 REST API 调用,从而极大地提高性能。这对于具有复杂且相互关联的数据的应用程序尤其有影响。
- 开发者体验:强类型模式、内省和更好的调试工具使开发更加顺利且不易出错。
- 生态系统和社区支持: Apollo Client 和 GraphQL 等工具丰富了体验,使学习 GraphQL 并将其更轻松地集成到我的工作流程中。
我是如何做出转变的
这个旅程并非没有挑战,但将其分解为多个步骤使过渡变得易于管理:
第 1 步:了解 GraphQL 基础知识
我从学习核心概念开始:
- 查询来获取数据。
- 突变 修改数据。
- 解析器 将模式定义连接到实际数据源。
这种基本理解是构建我的第一个 GraphQL 服务器的关键。
第 2 步:构建我的第一个 GraphQL 服务器
为了亲自实践,我使用 Node.js 和 Apollo Server 构建了一个简单的服务器。过程如下:
- 设置 Node.js 项目: 使用 npm init 初始化项目并添加必要的依赖项。
- 安装 GraphQL 依赖项: 安装了 apollo-server 和 graphql。
- 编写基本模式和解析器:定义一个模式来描述数据并编写解析器来获取数据。
- 运行服务器:启动服务器并使用 GraphQL 测试查询。
第一次看到它工作是不是很兴奋?这让我觉得付出的努力都是值得的。
第 3 步:转换现有 REST API
下一步是将 GraphQL 集成到现有的基于 REST 的项目中。我采取了渐进的方法:
- 确定了要替换为 GraphQL 查询或突变的关键 REST 端点。
- 构建了相应的 GraphQL 模式和解析器。
- 在过渡期间与 GraphQL 一起维护 REST 端点以确保稳定性。
这种混合方法使我能够在不破坏现有功能的情况下逐步推出 GraphQL。
快速入门指南:构建您的第一个 GraphQL 服务器
GraphQL 入门比看起来更简单。以下是使用 Node.js 和 Apollo Server 设置基本服务器的快速指南:
第 1 步:安装依赖项
首先初始化 Node.js 项目并安装必要的包:
npm init -y npm install apollo-server graphql
第 2 步:定义架构和解析器
创建一个名为index.js的文件并添加以下代码:
const { ApolloServer, gql } = require('apollo-server'); // Simulated user data 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' }, ]; // Define schema const typeDefs = gql` type User { id: ID name: String email: String } type Query { users: [User] user(id: ID!): User } `; // Define resolvers const resolvers = { Query: { users: () => users, user: (_, { id }) => users.find((user) => user.id === id), }, }; // Create server const server = new ApolloServer({ typeDefs, resolvers }); // Start server server.listen().then(({ url }) => { console.log(`? Server ready at ${url}`); });
第 3 步:运行服务器并测试
启动服务器:
node index.js
在浏览器或 GraphQL 等工具中打开提供的 URL 并测试查询:
查询所有用户:
query { users { id name email } }
通过ID查询单个用户:
query { user(id: "1") { name email } }
恭喜??您刚刚构建了您的第一个 GraphQL 服务器!
经验教训
切换到 GraphQL 给了我宝贵的教训:
进展顺利
- 这一转变显着提高了数据获取效率。不再有索取不足或过度索取的情况!
- 强类型模式减少了运行时错误并使调试更容易。
- 生态系统的工具(如 Apollo Client)提高了开发人员的工作效率。
我会采取什么不同的做法
- 循序渐进地学习:我一头扎进去,这让人不知所措。采取分阶段的方法并首先关注查询和突变会更顺利。
- 从小处开始:我首先用 GraphQL 替换单个 REST 端点,以了解工作流程。
给他人的建议
- 不要完全放弃 REST:REST 和 GraphQL 可以共存。使用 REST 进行简单操作,使用 GraphQL 满足复杂、相互关联的数据需求。
- 利用社区:GraphQL 拥有活跃的社区和优秀的资源。不要犹豫寻求帮助或学习他人的经验。
过渡到 GraphQL 不仅仅是改变工具,而是重新思考与数据交互的方式。从小事做起,不断尝试,享受这段旅程!
REST 与 GraphQL:快速比较
在 REST 和 GraphQL 之间做出决定时,了解关键差异可以帮助您为项目做出正确的选择。这是一个快速细分:
Feature | REST API | GraphQL |
---|---|---|
Data Fetching | Fixed data structure for endpoints; can lead to over-fetching or under-fetching. | Flexible queries; fetch exactly what you need. |
Endpoint Management | Multiple endpoints for different resources. | Single endpoint for all queries and mutations. |
Flexibility | Limited flexibility; requires custom endpoints for specific data needs. | Highly flexible; client defines data requirements. |
Type Safety | Relies on documentation; no built-in type enforcement. | Strongly-typed schema ensures predictable data. |
Error Handling | Custom error formats; inconsistent across APIs. | Standardized error responses from schema validation. |
Tooling | Varied and often endpoint-specific tools. | Rich ecosystem with tools like Apollo, GraphQL, and Relay. |
虽然 REST API 可靠且得到广泛支持,但 GraphQL 在需要复杂、相互关联的数据和灵活性的场景中表现出色。
更深入地研究我上一篇文章中的差异
结论
从 REST 过渡到 GraphQL 对我来说改变了游戏规则。灵活性、效率和改进的开发人员体验使我的项目更加健壮和可扩展。也就是说,我坚信 REST API 和 GraphQL 可以共存,在不同的用例中相互补充。
如果您正在考虑进行转换,我鼓励您从小事做起,进行实验,并逐渐将 GraphQL 集成到您的堆栈中。这是一段值得踏上的旅程,我很高兴看到你如何将它变成你自己的。
入门资源
这里有一些工具和指南可以帮助您深入了解 GraphQL:
- GraphQL 文档
- Apollo 服务器指南
- GraphQL 游乐场
班蒂尔在吗?
您是否已从 REST 过渡到 GraphQL,或者您是否正在考虑进行切换?一路走来,您经历过哪些挑战或成功?请随时在下面的评论中分享您的想法、问题或经验。让我们一起成长、一起学习! ?
以上是从 REST 到 GraphQL:我为何以及如何进行切换的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务
