相比于 REST,GraphQL 的优势在哪里?
RESTful API(Representational State Transfer)是一种基于HTTP协议设计的一种常用的API设计风格。它以资源为中心,使用HTTP动词对资源进行操作,常用的HTTP动词是GET、POST、PUT、DELETE等。RESTful API的设计风格简单明了,易于理解和使用,因此享有很高的流行度,是Web开发中的重要组成部分。
然而,RESTful API也有一些不足点。RESTful API的一个主要问题是“过度获取数据”。例如,一个网站需要展示一个用户的一些基本信息,但是在请求时,RESTful API会返回该用户所有的信息,包括用户名、地址、手机号、邮箱等等。这样的话,我们需要过滤掉一些我们不需要的信息。另外,如果我们需要获取更多的数据,我们需要进行更多的请求,这是非常低效的。
在这种情况下,GraphQL应运而生。GraphQL是一种用于Web客户端和服务器之间通信的查询语言和运行时环境。它允许客户端在服务端定义一个查询的数据类型和结构,以便客户端能够在一个请求中获取特定的数据。这种方式允许我们有效地获取所需的数据,减少了冗余的数据请求,从而提高了性能。
一.可定制的数据
GraphQL与REST的另一个巨大区别是其数据查询功能。REST显示服务器端的所有信息并隐藏部分不需要的信息,而GraphQL允许前端查询所有需要的信息,而不用缩减内容。这样,则可以减轻前端服务器的负担,提高前端页面的性能。
例如,当我们查找一个用户时,REST API默认会返回所有该用户相关的信息。在GraphQL的情况下,我们可以查询每个用户的特定数据,然后只返回所选数据。GraphQL查询信息如下:
- -------- ------ - ---- ----- ----- - -
以上代码通过用户ID检索用户信息,返回名称、电子邮件和电话号码。这允许开发人员提取所需数据并削减未使用的内容。这也是GraphQL更容易处理大型Web应用程序的原因之一。
二.支持数据关系
REST API支持资源之间的链接,但在所有场景下,链接的数量通常很有限。而GraphQL可以更完整地处理数据关系。
例如,考虑一个在线商店,其中有订单、产品和客户。在REST API上,各种类型之间的联系通常是链式嵌套的。此外,由于REST资源是对导出数据的直接映射,因此通过REST API轻松访问更复杂的数据可能是困难的。使用GraphQL,只需发出一个查询请求即可快速详细了解记录之间的联系。
三.将一次请求设置为多种操作
REST API和GraphQL最大的区别是GraphQL有一下四种基本操作:
- Query:读,用于查询一个或多个资源,并只请求需要的数据。
- Mutation:写,用于新增、修改或者删除资源,Mutation一次只能操作一个资源。
- Subscription:订阅,在应用程序中运行时,可继续查看新资源更新,只有当您关注的资源更新时才会发送通知。
- Union:用于存储多种对象类型的接口,比如汽车、卡车、火车等等都是交通工具,可以放在一起共同管理。
这个特性极大的增加了GraphQL的灵活性。
如下面这个例子就是一次GraphQL的请求,包括了查询和新增两个操作:
-------- - --------------- ------ - -- ---- - ----------- - -- ---- - -
优点:
- 一次请求中能够让我们查询和新增多个资源,极大的提高了api的性能。
- 对于微服务架构,更能胜任各种业务场景下复杂的数据处理,提供了更灵活多变的选择。
总结
GraphQL是RESTful API的一个强大替代品。它允许客户端从服务器中检索所需的数据,并减少无意义的请求,提高了性能。这意味着GraphQL可以在需要快速响应和减少网络流量的情况下适用于各种场景,特别适用于复杂应用程序。而对于RESTful API,它的优势在于通用性,对于一些简单的应用是十分适用的。无论何时,您必须权衡优缺点并选择对您的需求最好的API风格。
参考代码
GraphQL API:
----- - ------------------ -------------- ----------- ------------ ------------- - - ------------------- ----- ----- - ----------------- ----- -------- - --- ------------------- ----- ------- ------- -- -- -- --- - ----- ---------- -- ----- - ----- ------------- -- ------ - ----- ------------- -- ------ - ----- ------------- - -- --- ----- --------- - --- ------------------- ----- ---------------- ------- - ----- - ----- --------- ----- - --- - ----- ---------- - -- -------------------- ----- - ------ ------------------------------------------------------------ -- ---------- - - - --- -------------- - --- --------------- ------ --------- ---
RESTful API:
----- ------- - ------------------- ----- --- - ---------- ----- ---- - ----- --------------------- ----- ---- -- - ----- ----- - - - --- -- ----- ------ ------ ------------------ ------ -------------- -- - --- -- ----- ------- ------ ------------------- ------ -------------- -- - --- -- ----- -------- ------ -------------------- ------ -------------- -- - --- -- ----- -------- ------ -------------------- ------ -------------- - -- ----- ---- - --------------- -- ------- --- ----------------------- --------------- --- ---------------- -- -- - -------------------- --- --------- -- ---- ----------- ---
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64f5c614f6b2d6eab3e96457