您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

如何选择 REST 还是 GraphQL

时间:2023-10-25 12:26:48  来源:今日头条  作者:架构摆渡君

在本文中,简单比较 REST 和 GraphQL 的优点和缺点,以便您可以决定哪种 API 架构最适合您的项目

当我们要创建数据驱动的 Web 或移动应用程序,需要开发后台 API,通过它可以从后端服务器来访问或操作数据。目前最流行的 API 架构是 REST,尽管 REST 广为人知并且通常易于使用,但它也有一些缺点,主要是包括冗余数据的过度获取、扩展效率低下。

GraphQL 是一种新型 API 架构,其设计比 REST 更灵活、更高效,具有声明式数据获取等功能。虽然 GraphQL 已经变得相当流行,但它并没有取代 REST,因为一些用户发现它更难使用,并认为它是一个过度设计的解决方案,特别是对于较小的应用程序来说。

在本文中,将深入探讨 REST 和 GraphQL 的优缺点,以便您可以决定哪种 API 架构最适合您的项目。

REST

当前应用程序开发中 API 的主流架构是 REST,大多数后端框架将实现 REST。REST API 通常使用 HTTP 方法通过称为(例如GET /api/articles )的 URL 集合进行调用POST /api/articles。

 

Demo

以创建一个博客网站为例。在主页上,显示最新文章的摘要,包括标题、图像和简短说明。要为此提供数据,需要在后端服务器上设置一个 REST API,GET/api/articles它将以 JSON 数组的形式返回所需的数据,如下例所示:

// GET /articles
[
  {
    "id": 1,
    "title": "REST is Awesome",
    "image": "https://myrestblog.com/img/dsh9a89.png",
    "description": "The benefits of REST"
  },
  {
    "id": 2,
    "title": "How REST Works",
    "image": "https://myrestblog.com/img/33szad2.png",
    "description": "Learn about REST"
  }
]

 

REST优点

REST 在很大程度上击败了 SOAP、WebService、XML 等较旧的 API 协议,并且尽管出现了 GraphQL 等较新的替代方案,但仍继续流行,其主要原因为:

易于实施

在 Web 服务器应用程序中设置 REST 很简单,尤其是当它使用 JAVA的 Springcloud或 Python/ target=_blank class=infotextkey>Python 的 Requests 等 API 框架时。例如,使用 MongoDB 在 Express 应用程序中设置 REST 端点/articles就像调用数据库并将记录返回为 JSON 一样简单,如下所示:

python:

App.get('/api/articles', async (req, res) => {
    try {
        const articles = awAIt db.articles.find() res.json(articles)
    } catch (err) {
        res.status(500).send(err)
    }
})

 

广泛理解和协同开发

无论 GraphQL 是否优于 REST,大多数开发人员都会同意,当您使用自己所知道的知识时,开发效率会更高。截至 2022 年,如果您有多个开发人员在开发您的应用程序,或者您有公共 API,则大多数消费者将熟悉 REST,GraphQL 还不能说同样的情况,哈哈~~。

REST 的缺点

要理解为什么创建 GraphQL,我们需要首先看看 REST 的缺点

过度获取

回到博客的示例,假设创建了一个移动网站。与桌面版本一样,在主页上显示文章摘要。由于手机屏幕较小,这里的摘要只需要标题和图片,可以省略描述。不幸的是,由于GET /api/articles端点是固定的,移动版本description在调用 API 时仍然会收到该字段。这种低效率被称为“过度获取”,并且在发送大量数据时会成为挑战。

冗余数据效率低下

当对象包含表示相关实体的子对象时,该对象具有嵌套数据。例如,可能有一个带有嵌套评论对象的文章对象。由于实体在 REST 中被分配了自己唯一的URL,因此可能需要通过单独的 API 往返来填充嵌套数据。

例如,要获取一篇文章,我们首先使用端点GET /api/articles。要获取本文的评论,我们需要首先等待文章数据填充,以便我们知道在后续请求中需要获取哪些特定评论,如下面的代码示例所示。等待这些后续请求得到解决将增加用户在与页面交互之前必须等待的时间。

// GET /articles

[
  {
    "id": 1,
    "title": "REST is Awesome",
    "image": "https://myrestblog.com/img/dsh9a89.png",
    "description": "An article about REST",
    "comment_ids": [
      10,
      14,
      22
    ]
  },
  { ... }
]

 

GraphQL

REST 的低效率促使 Facebook 工程师在 2015 年创建了一种新的 API 设计,称为 GraphQL。GraphQL 迅速成为开发人员和公司的热门选择,推出了相关工具和服务的生态系统。与 REST 一样,GraphQL 不是一个特定的软件,而是 API 设计的规范。

GraphQL 工作原理

为了了解 GraphQL 的优势,快速概述它的工作原理。与 REST 不同,GraphQL 需要一个架构来告诉客户端和服务器允许通过 API 执行哪些数据和操作。它们是使用 GraphQL 模式语言定义的——一种与语言无关的简单格式,具有强大的类型系统。

Demo

Article让我们回到具有和实体的博客网站的示例Comment。在我们的 GraphQL 模式中,我们定义Article具有必需的整数id字段和title、image、 和的可选字符串字段的类型description,如下所示:

type Article {
  id: Integer!
  title: String
  image: String
  description: String
}

 

除了基本标量类型之外,模式对象还可以相互引用。Article例如,我们可以在类型和类型之间创建一对多关系Comment,如下所示:

type Article {
  id: Integer!
  title: String
  image: String
  description: String
  comments: [Comment]
}
type Comment {
  content: String
  article: Article
  author: Author
}

 

模型定义

GraphQL 模式的另一个重要用途是定义操作,其中包括读取数据的查询和写入数据的突变。在这里,我们提供了 的查询Articles,其类型为文章数组:

type Article {
  id: Integer!
  title: String
  image: String
  description: String
  comments: [Comment]
}
type Comment {
  content: String
  article: Article
  author: Author
}
type Query {
  articles: [Article]
}

 

GraphQL 的优点

通过对 GraphQL 的基本了解,我们现在可以了解它的主要优点。

声明式数据获取

GraphQL 的杀手级功能是声明式数据获取,客户端可以准确指定其需要的数据。这可以包括特定字段,甚至在嵌套对象内。我们之前看到,操作必须在模式上定义。不过,在这些操作中,我们可以指定希望查询返回哪些字段(最多达到架构的限制)。

例如,我们可以创建一个查询来Articles仅获取我们想要的字段,无论是否有嵌套Comments。请参阅下面的示例:

query {
  articles {
    id
    title
    image
    description
    comments {
      content
    }
  }
}

 

这是将从该查询返回的数据结构。请注意,GraphQL 响应中收到的数据将与请求它的查询具有相同的形状。

{
  "data": {
    "articles": [
      {
        "id": 1,
        "title": "REST is Awesome",
        "image": "https://restblog.com/img/dsh9a8.png",
        "description": "An article about REST",
        "comments": [
          {
            "content": "GraphQL is better!"
          },
          { ... }
        ]
      }
    ],
    ...
  }
}

 

通过这种方式,GraphQL 消除了过度获取和对嵌套数据的顺序调用的需要。

鲁棒性

由于强类型化和预定义查询的要求,GraphQL 可以提供开箱即用的验证和类型检查。反过来,这意味着 GraphQL 本质上是自记录的。一旦字段、类型或查询发生变化,基于模式的文档就可以自动更新。

版本控制

每次应用程序发生变化时,API 也可能需要更改。例如,假设我们决定将实体description中的字段重命名Article为blurb. REST 通过提供多个版本来处理这个问题,例如/api/v1,api/v2这对于 API 开发人员和消费者来说都是很麻烦的。使用 GraphQL,可以从架构中删除已弃用的字段,而不会影响现有查询。这为应用程序提供了对新功能的持续访问,并鼓励更清洁、更易于维护的服务器代码。

GraphQL 的缺点

虽然 GraphQL 为 REST 的缺点提供了一个优雅的解决方案,但请考虑一下 GraphQL 面临的一些批评。

取舍权衡困惑

一些开发人员认为 GraphQL 正在解决的问题常常被夸大了。例如,对于大多数小型应用程序来说,如果过度获取的几个字节的数据进入有效负载,这可能并不重要。

更难合作

另一个批评是 GraphQL 实现最终比 REST 更难编码,它还为新用户提供了更困难的学习曲线。

难以缓存

最后,GraphQL 经常因更难以缓存而受到批评,REST 客户端可以获得 HTTP 缓存的好处,因为所有端点都是 URL,而 GraphQL 客户端需要实现自己的自定义解决方案,如使用本地缓存,譬如redux-persit、localforage

结论

虽然 REST 架构在过去十年中主导了 Web 开发,但它对设置端点的使用使其有些不灵活且低效。GraphQL 通过提供严格类型的模式语言来解决这些问题,消费者可以根据需要进行查询。



Tags:GraphQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
构建 Web API 的两种流行选择:REST vs GraphQL
在 RESTful 和 GraphQL API 之间的选择取决于您的具体用例。RESTful API 适用于需要高可伸缩性的简单应用程序,而 GraphQL 则适用于具有不同数据需求的复杂应用程序。简介RES...【详细内容】
2024-01-09  Search: GraphQL  点击:(63)  评论:(0)  加入收藏
如何选择 REST 还是 GraphQL
在本文中,简单比较 REST 和 GraphQL 的优点和缺点,以便您可以决定哪种 API 架构最适合您的项目当我们要创建数据驱动的 Web 或移动应用程序,需要开发后台 API,通过它可以从后端...【详细内容】
2023-10-25  Search: GraphQL  点击:(154)  评论:(0)  加入收藏
安全地将 Netflix 迁移到 GraphQL
作者 | Jennifer Shin、Tejas Shikhare、Will Emmanuel译者 | Sambodhi策划 | Tina导读:本文介绍了 Netflix 在 2022 年将其移动应用程序迁移到 GraphQL 的过程。他们采用了...【详细内容】
2023-06-27  Search: GraphQL  点击:(211)  评论:(0)  加入收藏
GraphQL对比Rest,你学到了什么?
概述当创建web服务应用程序时,可以选择使用REST或GraphQL作为通信模式。两者都可能在HTTP上使用JSON,但有不同的优点和缺点。本文主要比较GraphQL和REST,以操作一个产品数据库...【详细内容】
2023-04-10  Search: GraphQL  点击:(263)  评论:(0)  加入收藏
技术选型:如何选择REST、GraphQL 和 gRPC
REST、GraphQL 和 gRPC 是现代 Web 应用程序中最流行的 3 种 API 开发技术。那么在做技术选型时,三者要如何选择呢?在本文中,我们将一起对比 REST、GraphQL 和 gRPC 的特性和用...【详细内容】
2023-03-17  Search: GraphQL  点击:(290)  评论:(0)  加入收藏
火爆外网的 DGS 框架使用,更方便 GraphQL 的使用
前言Netflix 已开放其 Domain Graph Service(DGS)框架的源代码 ,该框架是为了方便整合 GraphQL 使用,用于简化 GraphQL 的实现。GraphQL 主要是作用于数据接口,比如前端后端交互...【详细内容】
2022-04-21  Search: GraphQL  点击:(343)  评论:(0)  加入收藏
API怎么选?比较SOAP,REST,GraphQL和RPC
两个独立的应用程序需要中介程序才能相互通信。 因此,开发人员经常建立桥梁-应用程序编程接口-来允许一个系统访问另一个系统的信息或功能。为了快速,大规模地集成应用程序,使...【详细内容】
2020-12-01  Search: GraphQL  点击:(374)  评论:(0)  加入收藏
怎样设计安全的GraphQL API?
在这篇文章,我们将讨论一些各种 GraphQL 部署和迁移的安全风险,这些安全风险在客户管理过程中被发现。我们会讨论比较常见的高风险权限漏洞,以及不太常见的服务端请求伪造(SSRF)...【详细内容】
2020-10-23  Search: GraphQL  点击:(224)  评论:(0)  加入收藏
GraphQL 使用介绍
GraphQL 是 Fackbook 的一个开源项目,它定义了一种查询语言,用于描述客户端与服务端交互时的数据模型和功能,相比 RESTful API 主要有以下特点: 根据需要返回数据 一个请求获取...【详细内容】
2019-09-04  Search: GraphQL  点击:(1137)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(9)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条