GraphQLvsRESTAPI架构谁更胜一筹

GraphQLvsRESTAPI架构谁更胜一筹
2020-01-22 05:52:01 作者:责任编辑NO。魏云龙0298

作者 |Michele Moody

译者 | 平川

策划 | 万佳

2015 年,Facebook 开源 GraphQL。尔后,它在前端 Web 中大受欢迎。传统的 REST API 有何缺乏?GraphQL 优势安在?在本文中,咱们将深化探讨 GraphQL 的规划准则,比较 GraphQL 与 REST 的异同,并谈论 GraphQL 相对其他架构的长处。

1

你的 API 应该用哪项技能?

自从 2015 年 Facebook 开源 GraphQL 标准以来,它就在前端 Web 开发中敏捷流行起来。

为什么这种新技能会忽然流行起来?

与传统 REST API 比较,GraphQL 供给了哪些优势?

咱们将谈论 GraphQL 的规划准则,比较 GraphQL 与 REST 中的相同恳求,并深化探讨 GraphQL 相对其他架构的长处

为了解 GraphQL 作为 API 架构的长处,咱们要谈论 API 在客户端 - 服务器结构中的效果。API(应用程序编程接口)是一个中心层,它答应服务器从客户端接纳结构化数据恳求,并针对恳求的数据发送结构化的呼应。规划 API 架构的办法有很多种。

让咱们来研究一下促进 GraphQL 合适现代化 Web 应用程序的重要根本规划准则。

2

GraphQL 服务器的规划准则

GraphQL 标准归纳了 5 个规划准则,这使其成为现代前端开发的杰出处理方案。咱们看一下 GraphQL 的规划准则,并以 Facebook 新闻推送作为咱们的用例。

查询为分层结构,运用将查询与呼应数据1对1匹配的分层和嵌套字段格局。查询和呼应的形状相似于树,可查询每个项的其他嵌套字段。在 Facebook 的新闻推送中,这种结构答应一个查询回来一个帖子列表、每个特定帖子的谈论,以及每个谈论的点赞。

该结构以产品为中心,重视前端希望怎么接纳数据,并构建交给所需的运行时。这使得 Facebook 的新闻推送可经过一次恳求从后端获取需求的一切数据,使服务器依照 GraphQL 的标准从不同的端点获取数据。

它运用特定于应用程序的类型体系,该体系使开发人员能在履行前确保查询运用了有用类型,而且语法正确。例如,新闻推送的 GraphQL 形式要求字段“user”有必要包括一个字符串,而“likes”有必要包括一个数字。假如查询企图增加不相同的输入,GraphQL 将在履行查询前抛出一个过错。

GraphQL 查询是在客户端指定的,因而,客户端切当知道它将以何种格局接纳数据。这在某种程度上预示着,假如前端恳求的格局是包括用户名、谈论和点赞的 post 数据,那么来自 Facebook 新闻推送的恳求会构建在一个目标中,而不是像其他架构那样构建多个独自的数据块。

运用 GraphQL 的服务器结构有必要是内省的,或许可由 GraphQL 自己查询。所以才有了像 GraphiQL 或 GraphQL playground 这样的强壮东西。这两种东西都可以让 Facebook 开发人员精确地看到在他们的服务器上运用了哪些查询和字段。

为谈论向 GraphQL 的改变,以及这些规划准则怎么给开发带来长处。

咱们首要深化了解传统的 REST API 架构和它的缺乏之处。

3

传统的 RESTful 架构

REST 架构的规划范式侧重于分配 HTTP 恳求办法(GET、POST、PUT、PATCH、DELETE)和 URL 端点之间的联系。

在 REST 架构中,办法和端点的每个组合得到不同的封装功用。假如客户端需求的数据特定端点 / 办法不供给,则或许需求额定恳求。从 REST 恳求回来的数据格局依赖于端点—不能确保这些数据会依照前端需求的办法来进行格局化。为运用来自呼应的数据(格局与缺省情况下从端点回来的格局不同),有必要在客户端编写数据解析和数据操作。

接下来,让咱们看看 GraphQL 标准与 REST 的不同之处,以及它的长处。这些长处使这个新架构成为特别合适处理客户端和服务器之间数据交给问题的处理方案。

4

GraphQL 架构

与 RESTful API 相同,GraphQL API 规划用于处理 HTTP 恳求并对这些恳求供给呼应。无论怎么,这便是相似之处。REST API 构建在恳求办法和端点之间的连接上,而 GraphQL API 被规划为只经过一个端点,一直运用 POST 恳求进行查询,其 URL 通常是 yourdomain.com/graphql。

恳求抵达 GraphQL 端点后,客户端恳求的载荷彻底在恳求体中处理。这个恳求体有必要遵从 GraphQL 标准,API 有必要有恰当的服务器端逻辑来处理这些恳求并供给恰当的呼应。

这供给了比 RESTful API 更流通的客户端体会,后者或许要求客户端针对多个数据块宣布多个恳求,并在数据回来后做相关操作。

为了说明 GraphQL 是怎么完结这一点的,让咱们分化一下 GraphQL 服务器的结构。

5

GraphQL 服务器

启用 GraphQL 逻辑的服务器端逻辑由界说了服务器功用的 documents 组成。这些 documents 包括可履行文件和类型体系界说。望文生义,类型体系界说为每个数据字段界说可接受的类型和格局输入及成果。

可履行文件包括要处理的或许的操作列表,这中心还包括操作类型(查询、修正或订阅)、操作称号、要查询或写入的字段和一个挑选集,该挑选集精确界说了将从操作回来的数据。挑选集是 GraphQL 的最大价值地点——它们答应客户端查询特定的数据集并接纳包括所恳求信息的呼应:不多不少。

有关 GraphQL 标准的结构和语法的更多信息,请参阅 GraphQL 的文档。(https://graphql.github.io/graphql-spec/June2018/#sec-Overview)

接下来,咱们将看下 GraphQL 中查询的结构。

6

GraphQL 查询解析

下面是一个结构化的 GraphQL 查询,用于获取特定书本的数据,包括作者的姓和名

GET /graphql?query={ books(id:12) { authors { firstName, lastName } title, yearPublished, length }

{

Query { // operation type

books (id:12) { // operation endpoint

authors { // requested fields

firstName

lastName

}

title

yearPublished

}

}

}

这一切都可以终究靠一个查询由 GraphQL 服务器逻辑解析和处理完结。当把它与 REST 架构中相同结构的恳求进行比较时,GraphQL 的优势就开端显现出来了。

让咱们看看下面的 REST 恳求结构,然后要点谈论其间的一些差异!

7

REST 恳求解析

要向 REST API 宣布相同的恳求,客户端首要需求向可以回来图书数据的端点发送一个恳求,并将图书 id 作为参数传入:

GET /books/12

这个恳求或许会回来一个包括特定图书一切数据的目标,例如:

{

"title" : "The Hitchhiker's Guide to the Galaxy",

"authorID": 42,

"yearPublished" : 1978,

"length": 208,

"genre": "Science Fiction"

}

在咱们的比如里,与相同的 GraphQL 查询比较,该呼应有两个缺陷:

REST 呼应包括相似 genre 这样的额定数据,回来的信息超出了咱们的需求。

REST 需求再发送一个恳求来取得咱们实际上正在查找的数据:这个特定作者的一切书本。

为了取得这些数据,咱们应该运用咱们的 authorID 宣布一个额定的恳求:

GET /authors/42

这个恳求的呼应应该包括咱们正在查找的一切数据:

现在咱们已有了需求的一切书本和作者数据,呼应解析由客户端完结。现在,前端应用程序有必要将来自不同端点的数据组合在一起,用于完结希望的功用。总的来说,与 REST API 比较,GraphQL 供给的功能优势可认为前端开发人员带来报答。运用 GraphQL 标准创立服务器或许需求更多的设置以及编写猜测性的服务器端逻辑来解析和处理恳求。

尽管 GraphQL 的设置本钱或许比传统的 REST 架构要高,可是,更易于保护的代码、强健的开发东西和精简的客户端查询所带来的长处通常会超越本钱。

“如果发现本网站发布的资讯影响到您的版权,可以联系本站!同时欢迎来本站投稿!