首页 程序笔记 API架构REST和GraphQL怎么选?

API架构REST和GraphQL怎么选?

当我们要创建数据驱动的 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 的 Requests 等 API 框架时。例如,使用 MongoDB 在 Express 应用程序中设置 REST 端点/articles就像调用数据库并将记录返回为 JSON 一样简单,如下所示:

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。

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 消除了过度获取和对嵌套数据的顺序调用的需要。

版本控制

每次应用程序发生变化时,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 通过提供严格类型的模式语言来解决这些问题,消费者可以根据需要进行查询。

2

站心网

当我们要创建数据驱动的 Web 或移动应用程序,需要开发后台 API,通过它可以从后端服务器来访问或操作数据..

为您推荐

gRPC和REST API对比和选择

在现代 Web 开发和微服务架构中,gRPC 和 REST API 是最常见的通信协议。两者各有优劣,适用于不同的应用场景。本文将分别介绍 gRPC 和 REST API,并对它们的区别进行分析,帮助开发者根据需求选择合适的技术方案。g..

微服务架构定义与特点总结

1. 定义微服务是一种架构风格,将应用程序拆分为多个小型、独立的服务,每个服务运行在自己的进程中,通过轻量级通信机制(如HTTP/REST)交互。每个服务围绕特定业务功能构建,可独立开发、部署和扩展。2. 特点独立..

架构与思维:微服务架构的思想本质

我们为什么需要微服务架构,它一定是为了解决我们某些问题才出现了。这篇文章我们讨论下微服务架构模式所解决的问题,带来的挑战,以及他的核心思想本质。1 早期的服务架构上图是一个典型的服务分层架构:Client: ..

架构与思维:秒杀和竞拍的业务架构,永不过时的话题

1 互联网架构越来越复杂?为啥感觉互联网架构越来越复杂了,早期我们的系统,可能也就那么少部分人使用,大都是一些后台管理系统。所以不用考虑很多东西,比如:流量少,无需考虑并发问题数据少,不用考虑什么索引优..

一文搞懂SaaS架构建设流程:业务战略设计、架构蓝图设计、领域系统架构设计、架构治理与实施

大家好,我是汤师爷~SaaS架构建设是一项复杂的系统工程,不仅需要技术层面的实现,更要从业务战略、架构设计、治理与实施等多个维度进行全面规划。一个成功的SaaS架构可以帮助企业降低IT成本、提升业务灵活性、加快..

架构知识点(一)

执行阶段(Execution Stage)执行阶段是 CPU 流水线中的一个步骤,通常发生在取指阶段(Instruction Fetch, IF)和解码阶段(Instruction Decode, ID)之后。在执行阶段,CPU 会进行以下操作:执行算术或逻辑操作:..

一文搞懂架构设计的衡量标准:功能性、可用性、性能、可扩展性、安全性、协作效率、复杂度、成本效益

大家好,我是汤师爷~架构设计的首要目标是服务于业务需求。因此,我们不应该盲目追求所谓的"最厉害的"架构,而应该致力于寻找最适合当前业务环境和未来发展需求的架构方案。衡量架构的合理性是一个复杂的过程,需要..

架构知识点(二)

轮询调度(Round Robin Scheduling)是一种时间片轮转调度算法,主要用于多任务系统中。其基本思想是将所有任务排成一个队列,每次调度时,系统会从队列中取出下一个任务执行,直到任务完成或达到其时间片限制。当任..

小公司的程序员,老想跳槽怎么办?

7 月下旬的时候,有个读者私信我了很长很长一段文字,吐槽公司小(4 个后端,1 个前端),开发团队水平菜(不重视规范,所有业务逻辑都写到 Controller,而不是 Service),待遇福利差(一开始说双休,结果是单休)..

每一个程序员,都希望能成为分布式系统架构师

有很多读者经常问我,程序员的学习、成长之路应该怎么规划,才能早日成为一名架构师。作为一个曾经的架构师,在我走上技术管理这条路之后,管理的团队越来越大,现在我管理的技术团队有一百多人,最大的体会就是操心..

跨平台UI框架 MAUI Avalonia Flutter怎么选?

选择跨平台 UI 框架取决于你的项目需求、目标平台、开发团队的技能和框架的特点。以下是 MAUI、Avalonia 和 Flutter 的比较,帮助你做出合适的选择。1. .NET MAUI (Multi-platform App UI)微软推出的跨平台框架,可..

服务架构进化论

1.原始分布式时代一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然,早在单体系统盛行之前,我们的前辈们就已经探索过使用多个独立的分布式服务共同完成一个大型的系统的实现方..

money型的值输出后有四位小数,怎么只显示两位

SqlServer里有个类型是Money型,这个类型从数据库取出来后显示在页面上是小数点后四位的。 如价格23.0000元。 这样显示很难的,直接tostring也不行,还是会显示四位小数点。 可以通过string.Format("{0:F}",val)的..

.NET MVC ViewBag ViewData Mmodel怎么选择?

在.NET MVC中,有三种不同的方式可以在控制器(Controller)和视图(View)之间传递数据,分别是ViewBag、ViewData和Model。ViewBag:ViewBag是一个动态属性(dynamic property),它允许在控制器中传递数据到视图中..

mysql怎么随机查询数据

MySQL是一种广泛使用的关系型数据库管理系统,在进行数据查询时,随机查询数据是一项很有用的技能。以下是一些方法和技巧,可以帮助你使用MySQL在数据中进行随机查询。方法一:使用RAND()函数进行随机排序RAND()函数..

什么是微服务架构?它与单体应用程序架构有什么区别?如何在.NET中实现微服务架构?

微服务架构是一种软件架构风格,通过将应用程序拆分为一组小型、自治的服务来构建应用程序。每个服务都专注于解决特定的业务功能,并通过轻量级的通信机制进行交互。这些服务可以独立开发、部署和扩展,可以使用不同..

适合架构师阅读的书籍推荐

一、Software Architecture篇 这个领域没有什么"畅销书",可能读者中本来就是开发设计人员与项目经理占了多数,真正定位为架构师而且做的也是架构师工作的不多吧。 1.《Software Architect Bootcamp--软件架构师教..

什么是Kafka?Kafka架构原理

在《财富》 500强公司中,超过三分之一的公司使用Kafka。这些公司包括排名前十的旅行社,排名前十的银行中有七个,排名前十的保险公司中有八个,排名前十的电信公司中有九个,等等。LinkedIn,Microsoft和Netflix每..

系统架构7个非功能性需求

在软件系统里面,功能性需求是面向用户、详细明确的需求,由产品人员根据市场的需要提炼出来,是产品生命周期里最重要的一环。比如电商系统里面的优惠券功能,通常包含需求:优惠券分类、细分领券人群、核销优惠券等..

.NET Core怎么判断请求类型

NET Core 中可以通过以下方法判断请求类型:使用 HttpRequest.Method 属性:HttpRequest.Method 属性可以获取请求方法,例如 GET、POST、PUT、DELETE 等。var request = HttpContext.Request;if (request.Method == ..

发表回复

返回顶部