GraphQL vs REST API: 详解 REST API 的瓶颈

阅读时长 7 分钟读完

#GraphQL vs REST API: 详解 REST API 的瓶颈

##背景

在前端开发过程中,API是不可避免的一部分。REST API是大多数前端工程师熟悉并使用的标准。然而,随着前端技术不断的发展和需求不断的升级,REST API的限制逐渐暴露出来。本篇文章将围绕着GraphQL vs REST API进行探讨,并详细解析REST API的瓶颈问题及解决方案。

##REST API的瓶颈

  1. 粒度问题

REST API需要通过URL来描述资源的位置,因此需要将每个资源分配到一个独特的URL上,这常常导致了粒度的问题。对于细粒度的需求,需要多次请求不同的API来满足,而且这种情况下会出现重复的数据。对于粗粒度的需求,会存在一些数据冗余的问题。

举个例子,当需要获取一张图片和它的作者信息时,需要请求两次API,如下所示:

这样会引起重复数据的问题,尤其是大型应用和高并发应用中更为明显。

  1. 版本管理问题

REST API是以HTTP头部中的Accept和Content-Type字段来实现版本控制的。但是,当要更改API的语义、表现或数据格式时,必须更新API版本并通知客户端升级。

这样会导致客户端或服务器端因为版本兼容性问题而出现错误,大量的维护工作也会增加开发工作量,较大的公司甚至需要招聘更多的人力负责API维护。

  1. 请求响应式问题

REST API返回一个完整的响应,即使请求中只需要一部分数据。这会浪费大量的带宽和服务器资源。资源过多的情况下,前端需要花费更多的时间来处理响应,导致性能下降。

##GraphQL是什么

GraphQL是一种旨在为客户端提供更高效、强大和灵活的查询方式的查询语言和执行引擎。它是在REST API面临的挑战下出现的,由Facebook推出并在2015年公开发布。

GraphQL中的查询可以指定需要返回哪些字段,以及每个字段的嵌套级别,这意味着可以通过单个请求返回所需的所有数据,而不用发送多个请求。这是一种更精细的粒度管理方式,同时也解决了版本管理问题。它还具有出色的数据缓存和分层特性。GraphQL还提供了类型、变量和指令等高级功能,这些功能可以简化代码并提高开发效率。

##GraphQL vs REST API

与REST API相比,GraphQL有很多优势。

  1. 精细控制

GraphQL允许客户端请求所需的精细控制,不会遇到REST API的不同粒度请求和重复响应数据的问题。GraphQL查询指定了每个字段和嵌套级别,服务器可以根据查询返回所需的数据。

-- -------------------- ---- -------
----- -
  --------- ---- -
    -----
    ---
    ------ -
      ----
      -----
    -
  -
-
  1. 版本管理

GraphQL是自描述的,意味着客户端可以轻松确定数据的类型和格式,不像REST API需要使用Accept和Content-Type字段进行版本控制。不再需要在API更改时增加版本号,也不需要手动更新客户端代码。这种自描述性也使得在服务响应中返回元数据,例如字段的描述和枚举类型的值,变得容易。

  1. 请求响应式控制

GraphQL是一种解决REST API请求过多的问题的新方式。对于REST API中需要多个请求对应的数据需要在请求中返回,GraphQL可以只返回客户端需要的数据,无论是粗粒度的数据还是细粒度到单个字段的数据,这一切都可以通过单个查询获取。由于GraphQL的这种查询和响应方式,缓存会更加高效,请求会更加稳定,减少了有些情况下响应倍增现象。

  1. 技能转换

GraphQL易于学习,是面向客户端的查询语言,调试工具简单易用,而API的局限性在日常工作中不断表现,将所有客户端对API的请求转移至GraphQL是有足够的成本效益的。

##指导意义

GraphQL的适用场景在后端的接口定义中,可以有效地解决粒度、版本管理和请求响应式控制等瓶颈问题。但在实际使用过程中,需要特别注意以下问题:

  1. GraphQL的设计原则

GraphQL不能滥用,如果你的数据模型只使用了一小部分字段,那么使用REST API就足够了。另外,GraphQL的复杂查询可以导致潜在的性能问题。好的API设计原则和良好的查询结构可以减少性能问题的出现。

  1. GraphQL技术选型

GraphQL是一种较新的技术,需要搭配各种库和框架进行实现。目前市场上主流框架有Apollo和Relay两种,需要根据项目的实际需求进行选型。

实现GraphQL示例代码如下所示:

-- -------------------- ---- -------
----- ------- - -------------------
----- ----- - -----------------

----- -
    ------------------
    --------------
    -----------
    -------------
- - --------

----- ----------- - --- -------------------
    ----- ----------
    ------- -- -- --
        --- - ----- ------------- --
        ----- - ----- ------------- --
        ------------ - ----- ------------- --
        ------ -
            ----- --- ----------------------
            -------------------- ----- -
                ------ --------------------------------------------------------------------
                    ---------- -- -----------
            -
        -
    --
---

----- -------- - --- -------------------
    ----- -------
    ------- -- -- --
        --- - ----- ------------- --
        ---------- - ----- ------------- --
        ---- - ----- ---------- --
        -------- -
            ----- ------------
            -------------------- ----- -
                ------ ---------------------------------------------------------------------
                    ---------- -- -----------
            -
        -
    --
---

----- --------- - --- -------------------
    ----- ----------------
    ------- -
        ----- -
            ----- ---------
            ----- - --- - ----- ------------- - --
            -------------------- ----- -
                ------ ---------------------------------------------------
                    ---------- -- -----------
            -
        --
        -------- -
            ----- ------------
            ----- - --- - ----- ------------- - --
            -------------------- ----- -
                ------ -------------------------------------------------------
                    ---------- -- -----------
            -
        -
    -
---

-------------- - --- ---------------
    ------ ---------
---

##结论

GraphQL是一个优秀的技术,提供了更高效、灵活的查询方式,解决了REST API的瓶颈问题。在大型开发项目中,采用GraphQL技术做到满足用户需求,并解决API局限性问题。在实际应用过程中,遵循GraphQL的设计原则、合理选型和优秀查询结构可以减少性能问题的出现,保证应用系统的稳定通畅。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67762fd96d66e0f9aa0b3ef4

纠错
反馈