为了账号安全,请及时绑定邮箱和手机立即绑定

为什么选择GraphQL?一份面向开发者的API进化指南

标签:
接口测试 API

在 API 的世界中,GraphQL 和 REST 一直是讨论的焦点。

两者各有优缺点,但知道何时以及为何选择一个而不是另一个,可以极大改变你的开发工作流程,带来巨大变化。

这篇帖子深入探讨了以下几点:GraphQL 是什么以及为什么存在,何时使用,以及它与 REST 的区别——所有这些都用简单的语言和实际示例来解释。

  • 什么使 GraphQL 特别?
  • GraphQL 的关键特性
  • 何时使用 GraphQL?

  • 为移动和 Web 应用程序优化性能

  • 实时仪表盘

  • API 聚合与版本化

  • 优化性能并减少延迟时间

  • 开发人员体验
  • GraphQL 与 REST:关键差异

  • 📌 示例:获取用户资料信息(示例说明)

  • 🔴 REST 方式(多次请求)

  • 🟢 GraphQL 方式(单次请求)

  • 了解 GraphQL 架构定义

  • 示例 GraphQL 架构:

  • GraphQL 操作:查询、变体和订阅

  • 1️⃣ 查询

  • 2️⃣ 变体

  • 3️⃣ 订阅
  • 何时应继续使用 REST?
  • 结论

  • 更多信息:进一步阅读
GraphQL 为什么这么特别?

GraphQL 由 Facebook 在 2012 年创建,并于 2015 年开源,旨在解决 REST API 的常见效率问题。

这不仅仅是一个普通的API标准;它是一种查询语句,让客户端只需请求他们需要的内容,不多不少。

如图所示

这解决了在 REST API 中常见的问题,比如拿到太多数据或者拿到太少数据。

图片:图片描述

这就是为什么GraphQL是每个开发者的梦想。

  • 精准的数据获取: 客户端明确指定他们需要的数据,减少了过度和不足获取数据的情况。
  • 单个端点: 与REST不同,REST通常需要向不同的端点发出多个请求,而GraphQL通过一个请求即可从多个来源聚合数据。
  • 强类型模式: 通过一个良好的定义模式,API具备自我文档化的特性,确保稳定性和可预测性。

这导致了更快的申请过程更简单的维护工作,以及整体更棒的开发体验

GraphQL的关键特性
  1. 高效的数据获取:客户端精确指定所需的数据,减少不必要的数据传输量。
  2. 单一端点:与REST使用多个端点不同,GraphQL使用单个端点用于所有查询。
  3. 强类型化模式:GraphQL API通过一个模式定义,确保类型安全并实现自我文档化。
  4. 实时数据:支持订阅,实现实时数据更新。
  5. 数据聚合:轻松地将来自多个来源的数据整合到一个响应。
何时你应该使用 GraphQL?

GraphQL 并不是万能药,但在某些情况下它表现得非常出色。

以下是一些实际用例,在这些用例中,GraphQL可以显著提高API的性能和灵活性:

移动和Web应用的性能优化技巧

  • 没有过度获取或不足获取:使用 REST 时,你经常会获取到比实际需要更多的数据(过度获取),或者需要多次请求才能获取到所有需要的数据(不足获取)。
  • GraphQL 允许你在一次查询中仅请求你需要的字段,从而解决这个问题。
  • 更快的加载时间:通过减少在网络上传输的数据量,GraphQL 改善了性能,尤其是对于移动应用和低带宽环境来说。

实时的控制面板

  • GraphQL支持实时订阅,客户端可以通过实时订阅实时接收数据变化的更新。
  • 这对聊天应用、实时仪表盘或通知等功能来说非常理想。

API 整合与版本控制

  • 管理多个API?无需管理不同的REST端点,你可以提供一个GraphQL API,从各种服务中获取数据。
  • 此外,你可以升级模式而不会影响现有客户端,这与REST严格的版本控制不同,因此无需担心现有的客户端会受到影响。

提升性能,减少延迟

  • GraphQL 消除了过度获取数据(获取不必要的数据)和数据不足(完成任务需要多次请求)。
  • 这使得更快的响应更低的带宽使用,非常适合对性能要求高的应用。

开发者体验

  • 自文档性:GraphQL 的模式本身就是文档,让开发者更容易上手 API。
  • 强大的工具:例如 Apollo Client 和 GraphiQL 这样的工具提供了极佳的开发体验,包括自动补全、错误高亮和查询测试。
GraphQL 与 REST 的主要区别

虽然REST被广泛使用且易于理解,但GraphQL在API设计上提供了一种更现代化和灵活的方式。让我们来看看一些关键的区别:

这是一张图片: 图片描述

功能 REST GraphQL
数据获取 多个端点,常常导致过度获取或获取不足。 单一端点,客户端仅请求所需的数据。
性能 需要多次往返服务器。 单次请求获取所需数据,减少网络开销。
缓存 内置HTTP缓存机制。 没有内置缓存,但可以使用第三方库(如Apollo,Relay)来实现。
模式 没有模式;文档通常单独提供。 强类型模式,自我文档化。
学习曲线 对熟悉HTTP的开发者来说容易理解。 由于其特有的查询语言和概念,学习曲线更陡峭。
文件上传 原生支持上传。 没有原生支持;需要使用其他方法解决。
实时更新 需要额外的设置(例如,WebSocket)。 内置实时更新支持,通过订阅实现。
API演化 需要版本化(例如,/v1,/v2)。 模式可以演化,不会影响客户端。
自我文档化 需要单独的文档(Swagger,Postman)。 模式充当实时文档功能。

一个简单的例子:获取用户资料数据

REST 风格的多次请求

想象一款移动应用,需要显示用户的个人基本信息,包括最近的动态和粉丝数量。

  1. 请求 GET /user/123 → 返回用户的基本信息(姓名、邮箱、简介信息)。
  2. 请求 GET /user/123/posts → 获取最近帖子。
  3. 请求 GET /user/123/followers/count → 查看关注者数量。

这意味着三个单独的请求。更多的请求会导致更高的延迟和包含不必要的数据导致的带宽浪费。

GraphQL 的方式(一次请求即可)

通过 GraphQL,客户端可以在一次查询中获取它真正需要的内容:

    query {
      用户(id: "123") {
        名字
        邮箱
        简介
        发布(前: 3) {
          标题
          内容
        }
        关注者数
      }
    }

全屏 退出全屏

这个请求获取了所有必要的数据,不包含多余的字段或冗余的 API 调用,减少了延迟,提升了性能。

图片描述

理解 GraphQL 架构

一个 GraphQL 的模式定义了客户端可以请求的数据类型。它充当客户端和服务器之间的协议,以便确保数据结构化和高效检索。

模式通常用模式定义语言(SDL)来编写,这使得它们既容易阅读也容易理解。模式由各种对象类型组成,每个对象类型都有指定可用数据的字段。

例如 GraphQL 架构:

    # 查询类型定义
    type Query {
      user( id: ID! ): 用户
    }

    # 用户类型定义
    type 用户 {
      # 用户名
      name: String
      # 电子邮件
      email: String
      # 简介
      bio: String
      # 帖子列表
      posts( limit: Int ): [文章]
      # 关注者数量
      followersCount: Int
    }

    # 帖子类型定义
    type 文章 {
      # 标题
      title: String
      # 内容
      content: String
    }

全屏模式 退出全屏

这里

  • Query 定义了可以使用的查询。
  • User 类型包含一些字段,如 nameemailpostsfollowersCount
  • Post 类型包括 titlecontent 这两个部分。

……

GraphQL 操作:查询、变异操作和订阅

1️⃣ 问题

GraphQL 查询语句 等同于 REST GET 请求——它们只是获取数据,而不做任何修改。

2 变异

突变允许客户端用户创建、更新或删除数据,类似于 REST 的 POST、PUT、PATCH、DELETE 方法(这些方法分别对应创建、更新、部分更新、删除操作)。

例如的更新用于更新用户资料:
(例如,更新用户资料的 mutation)

    mutation {
      更新用户信息(id: "123", bio: "探索GraphQL!") {
        名字
        简介
      }
    }

点击这里进入全屏,点击这里退出全屏

3️⃣ 订阅,

GraphQL 订阅功能 可以通过 WebSocket 实现实时数据更新。与需要手动轮询的查询不同,订阅功能则在数据发生变化时自动推送变更。

例如,订阅以接收新帖子的通知

    订阅设置 {
      新发帖 {
        帖子标题
        帖子内容
      }
    }

进入或退出全屏模式

这可以让客户保持更新,而无需反复请求。

何时使用 REST

GraphQL 非常强大,而在某些情况下 REST 仍然是一个可靠的选择

  1. 简单的 API:如果你的 API 有较为简单清晰的数据需求,REST 的简洁性可能更合适。
  2. 缓存需求:REST 内置的 HTTP 缓存比 GraphQL 的第三方解决方案更具优势。
  3. 文件上传:REST 原生支持文件上传,而 GraphQL 需要额外的设置。
  4. 遗留系统:如果你正在使用现有的 REST API,除非有充分的迁移理由,否则迁移到 GraphQL 可能不值得。许多大型公司如 Facebook、GitHub 和 Netflix 使用 GraphQL 来以提高 API 的效率和灵活性。

图片描述 "图片描述:此处应有描述,但原图未提供文字说明。"

最后

GraphQL 提供了一种现代替代方案,允许客户端从单个端点获取他们确切需要的信息。这使得应用程序更快,并且更简单的维护和更好的开发体验。然而,GraphQL 存在一定的学习曲线,并且需要后端调整,因此评估是否适合您的 API 需求很重要,因为这决定了它是否是正确的选择。

你有使用过 GraphQL 吗?在某些项目中你更倾向于使用 REST 吗?快来评论区分享你的想法吧!

🚀 关注我们,获取更多API的深度解析内容!

更多阅读资料

说到REST和GraphQL,你是用REST,想给你的API写文档吗?我最近一直在用一个超级方便的工具叫LiveAPI(一个超级方便的工具)。

LiveAPI 可以帮助你快速在几分钟内完成所有的后端 API 的文档化

使用LiveAPI,你可以快速生成可以互动的API文档,让用户可以直接在浏览器里尝试API。

看看这张图片

如果你厌烦了手动为你的API编写文档,这个工具或许能让你的生活更轻松一些。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消