GraphQL 的前世今生

GraphQL是什么

    GraphQL是一种新的API标准,它提供了一种更高效、强大和灵活的数据提供方式。它是由Facebook开发和开源,目前由来自世界各地的大公司和个人维护。GraphQL本质上是一种基于api的查询语言,现在大多数应用程序都需要从服务器中获取数据,这些数据存储可能存储在数据库中,API的职责是提供与应用程序需求相匹配的存储数据的接口。有的人经常把GraphQL和数据库技术相混淆,这是一个误解,GraphQL是api的查询语言,而不是数据库。从这个意义上说,它是数据库无关的,而且可以在使用API的任何环境中有效使用,我们可以理解为GraphQL是基于API之上的一层封装,目的是为了更好,更灵活的适用于业务的需求变化。


GraphQL出现的历史背景

    当提起API设计的时候,大家通常会想到SOAP,RESTful等设计方式,从2000年RESTful的理论被提出的时候,在业界引起了很大反响,因为这种设计理念更易于用户的使用,所以便很快的被大家所接受。我们知道REST是一种从服务器公开数据的流行方式。当REST的概念被提及出来时,客户端应用程序对数据的需求相对简单,而开发的速度并没有达到今天的水平。因此REST对于许多应用程序来说是非常适合的。然而在业务越发复杂,客户对系统的扩展性有了更高的要求时,API环境发生了巨大的变化。特别是从下面三个方面在挑战api设计的方式:
1.移动端用户的爆发式增长需要更高效的数据加载

Facebook开发GraphQL的最初原因是移动用户的增加、低功耗设备和松散的网络。GraphQL最小化了需要网络传输的数据量,从而极大地改善了在这些条件下运行的应用程序。

2.各种不同的前端框架和平台

前端框架和平台运行客户端应用程序的异构环境使得我们在构建和维护一个符合所有需求的API变得困难,使用GraphQL每个客户机都可以精确地访问它需要的数据。

3.在不同前端框架,不同平台下想要加快产品快速开发变的越来越难

持续部署已经成为许多公司的标准,快速的迭代和频繁的产品更新是必不可少的。对于REST api,服务器公开数据的方式常常需要修改,以满足客户端的特定需求和设计更改。这阻碍了快速开发实践和产品迭代。

    GraphQL的出现不仅仅是针对开发人员的,Facebook在2012年开始在其native mobile apps中使用GraphQL。但有趣的是GraphQL大部分都是在web技术的背景下使用的,并且在native mobile 领域中只得到很少的支持。 Facebook第一次公开谈论GraphQL是在宣布开源计划后不久的2015年React峰会的时候。因为Facebook总是在React的背景下谈GraphQL,所以对于没有React经验的开发人员来说,要理解GraphQL并不是一种仅限于React使用的技术可能还需要一段时间。即便是在这样的背景下诞生的GraphQL依然是一个快速增长的社区 ,事实上GraphQL是一种技术,可以在客户端与API通信的任何地方使用。有趣的是Netflix和Coursera等其他公司都在研究类似的想法以提高API的交互效率。Coursera设想了一种类似的技术,可以让客户指定其数据需求,而Netflix甚至将其解决方案称为Falcor。在GraphQL被开源之后,Coursera完全停止了他们在Falcor上的努力,并转到了GraphQL的学习上。目前已经有很多的公司在使用GraphQL(https://graphql.org/users/)。

640?wx_fmt=png


GraphQL和RESTful的区别

前面提到GraphQL可以理解为基于RESTful的一种封装,目的在于构建使Client更加易用的服务,可以说GraphQL是更好的RESTful设计。在过去的十多年中,REST已经成为设计web api的标准(虽然只是一个模糊的标准)。它提供了一些很棒的想法,比如无状态服务器和结构化的资源访问。然而REST api表现得过于僵化,无法跟上访问它们的客户的快速变化的需求。 GraphQL的开发是为了应付更多的灵活性和效率,它解决了与REST api交互时开发人员所经历的许多缺点和低效之处。 为了说明在从API获取数据时REST和GraphQL之间的主要区别,让我们考虑一个简单的示例场景:在blog应用程序中,应用程序需要显示特定用户的文章的标题。同一屏幕还显示该用户最后3个关注者的名称。REST和GraphQL如何解决这种情况?

 使用REST API来现实时,我们通常可以通过访问多次请求来收集数据。比如在这个示例中,我们可以通过下面的三步来实现:

 1. 通过 /user/<id>获取初始用户数据

 2. 通过/user/<id>/posts 返回用户的所有帖子

 3. 请求/user/<id>/followers,返回每个用户的关注者列表

调用关系如下图所示:

 640?wx_fmt=png

如果用GraphQL的话,我们只需要一次请求就可以完成上述的需求

640?wx_fmt=png

在GraphQL的世界里我们不用多取数据,也不用担心数据取少了,我们只需要按需获取即可。

REST最常见的问题之一是API的返回数据过多或者过少,这是因为客户端下载数据的唯一方法是通过访问返回固定数据结构的endpoint,这就会导致我们设计API非常困难,因为它既要能够为客户提供精确的数据需求,又需要满足不同调用者的需求,这本身就是相互矛盾的。GraphQL的发明者Lee Byron提出了一个很重要的概念: “用图形来思考,而不是endpoint”

通过上述直观展示我们可以得出一下几点:

1. 获取了许多多余的数据

通常情况下我们在调用一个通用API接口时,客户端获取的信息比应用程序中实际需要的要多。例如UI需要显示一个用户列表,而实际上只需要使用他们的名字。在REST API中通常会调用 /user 这个endpoint,并接收一个带有用户数据的JSON数组。但是这个响应可能包含更多关于返回的用户的信息,例如他们的生日或地址,而这些信息对客户来说是无用的,因为它只需要显示用户的名字。

2. 获取的数据少于Client所需要的数据

一般来说数据获取不足意味着某个特定的endpoint 没有提供客户端需要的足够信息,客户端将需要额外的请求来获取它所需要的一切。这可能会升级到客户端需要首先获取列表信息,然后需要对单条数据添加一个额外的请求以获取其他所需的数据,例如考虑其他Client 也需要显示每个用户的最后三个关注者,该API提供了额外的endpoint  /user/<userid>/followers,为了能够显示所需的信息,Client 必须向 /users endpoint 发出一个请求,然后点击/user/<user-id>/follwers endpoint 来获取单个用户的follwers信息。

3. 前端的快速产品迭代对API有很大的挑战

REST api的一个常见模式是根据你在应用程序内部的展现逻辑来构造endpoint,这很方便,因为它允许客户端通过访问相应的endpoint获取特定视图的所有所需信息。 这种方法的主要缺点是它不允许前端的快速迭代。对于UI所做的每一个更改,现在都存在比以前更多(或更少)的数据的高风险。因此,需要对后端进行调整,以满足新的数据需求,这会降低生产力并显著降低将用户反馈集成到产品中的能力。 使用GraphQL这个问题就解决了。由于GraphQL的灵活性,无需在服务器上额外工作就可以在客户端上进行更改。由于客户端可以指定准确的数据需求,所以当前端的设计和数据需求发生变化时,并不需要后端API做出任何的修改就可以满足展现层的变化。

 4. Schema和类型系统的好处

GraphQL使用强大的Type System来定义API的功能。所有在API中公开的类型都是使用GraphQL schema Definition Language (SDL)在模式中编写的。该模式充当客户端和服务器之间的契约,以定义客户机如何访问数据。 一旦定义了模式,在前端和后端工作的团队就可以在没有进一步通信的情况下完成工作,因为他们都知道通过网络发送的数据的确切结构。 前端团队可以通过mock所需的数据结构来轻松测试他们的应用程序。一旦后端API实现完成,就可以对客户端应用程序进行切换来调用实际的API获取数据,这也可以使得我们实现更好的客户端和服务端的分离。

 我们可以看出GraphQL的出现可以使得我们后端API具有更大的灵活性以及扩展性以满足不同client对数据的需要,这大大丰富了API的数据提供的能力。 

原文地址https://www.cnblogs.com/xiandnc/p/9162298.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj6801-NOIP2020.9.19模拟patrick【树状数组】

正题 题目大意 nnn个连续的数&#xff0c;第iii个为hih_ihi​。有操作 给出一个HHH&#xff0c;询问大于等于HHH的数能组成多少个联通块修改一个位置的数。 解题思路 考虑计算连通块尾的数量&#xff0c;我们可以发现一个位置作为联通块尾部当且仅当hi≥Hh_i\geq Hhi​≥H且h…

Codeforces Round #485 (Div. 2)

Codeforces986B [Petr and Permutations] 看到两个随机的swap次数&#xff0c;很容易想到跟奇偶性有关。然后就凉了。赛后思考了一下&#xff0c;这个思路应该没问题&#xff0c;那就需要考虑swap的奇偶性与排列的关系。因此&#xff0c;我们考虑如何把两个不相邻数的swap&…

初一模拟赛总结(5.18)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf210210210505050606060303030707070111hkyhkyhky210210210100100100404040000707070333wjjwjjwjj190190190100100100000000909090444fyfyfy170170170100100100000000707070555tj…

Codeforces Round #486 (Div. 3)

E. Divisibility by 25 能被25整除的充要条件就是末两位是00&#xff0c;25&#xff0c;50&#xff0c;75。如果没有过程中不出现前导0这一限制&#xff0c;显然对每种情况&#xff0c;贪心取尽量低位即可。本题的关键就在于如何满足这个条件&#xff0c;首先有个”显然”的方法…

C#:如何将坏的代码重新编译为好的代码

自己的前言说明&#xff1a;本文原作者&#xff1a;Radoslaw Sadowski&#xff0c;原文链接为&#xff1a;C# BAD PRACTICES: Learn how to make a good code by bad example。本系列还有其他文章&#xff0c;后续将慢慢翻译。引言&#xff1a;我的名字叫Radoslaw Sadowski&…

P6855-「EZEC-4.5」走方格【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6855 题目大意 n∗mn*mn∗m的网格&#xff0c;每个格子有一个数&#xff0c;可以选择一个位置变为000。要求最小化最大权值和路径。 解题思路 考虑枚举哪个位置变为000&#xff0c;一个位置变为000后我们将路径分为两种路径…

【搜索树】高级打字机(luogu 1383)

高级打字机 luogu 1383 题目大意&#xff1a; 有三种操作&#xff1a;添加一个字符&#xff08;更改操作&#xff09;&#xff0c;撤回前iii步步更改操作&#xff08;更改操作&#xff0c;可以撤回自己&#xff09;&#xff0c;输出某一位的字符&#xff0c;现在要按要求输出…

AtCoder Grand Contest 025

B.RGB Coloring 绿色可以看作拿红和蓝都涂了&#xff0c;那么只需要满足A*a B*b K && 0 ≤ a,b ≤ n&#xff0c;答案加上C(n,a)*C(n,b) #include <bits/stdc.h> typedef long long ll; const ll mod 998244353; const int N 300000 100; using namespace s…

走进 Cake for .NET

一、什么是 CakeCake&#xff08;C# Make&#xff09; 是一个使用 C# DSL 面向 Task 的跨平台构建自动化系统&#xff0c;像编译代码&#xff0c;复制文件和文件夹&#xff0c;运行单元测试&#xff0c;压缩文件和构建 NuGet 包。更多内容请访问官网二、使用 Cake先尝试一下 P…

jzoj4616-[NOI2016模拟7.12]二进制的世界【平衡规划,dp】

正题 题目大意 nnn个数&#xff0c;对于每个数找左边的一个数执行optoptopt操作使得答案最大&#xff0c;并且求有多少个数能够使得最大。 解题思路 我们设fi,jf_{i,j}fi,j​表示下一个数的后888位为iii&#xff0c;当前数的前888位为jjj时的最大后888位的答案。然后每次用fi,…

Wannafly挑战赛17

剩下的不太会就没接着打了&#xff0c;没有注意到比赛截至时间&#xff0c;好像提前了几分钟公开题解。意识到的时候已经来不及了。。。抱歉。。。 —————————————————————————————————————— A.走格子 按题意模拟即可 #include <bits/…

【结论】环

环 题目大意&#xff1a; 给出一个环中的三个数&#xff0c;这三个数按输入顺序连接&#xff08;有向&#xff09;&#xff0c;问连接的线是顺时针还是逆时针 原题&#xff1a; 题目描述 有一个圆&#xff0c;1-N共N个数在圆环上顺时针排列着。 现在给你a,b,c三个数&#…

Asp.Net Core 快速邮件队列设计与实现

发送邮件几乎是软件系统中必不可少的功能&#xff0c;在Asp.Net Core 中我们可以使用MailKit发送邮件&#xff0c;MailKit发送邮件比较简单&#xff0c;网上有许多可以参考的文章&#xff0c;但是应该注意附件名长度&#xff0c;和附件名不能出现中文的问题&#xff0c;如果你遇…

CF1114F-Please, another Queries on Array?【线段树,欧拉函数】

正题 题目链接:https://www.luogu.com.cn/problem/CF1114F 题目大意 nnn个数的一个序列要求支持 区间乘上一个数询问一个区间的乘积的φ\varphiφ值 解题思路 因为数很小&#xff0c;而我们求φ\varphiφ需要知道一个数所包含的质因子。发现在300300300以内的只有626262个质…

牛客练习赛20

A. 礼物 枚举一元奥利奥的个数&#xff0c;计算2元的个数&#xff0c;现在需要解决从N种物品中&#xff0c;取x个的方法数&#xff0c;把N个种类看作N个盒子&#xff0c;奥利奥看作球&#xff0c;就是经典球盒模型了。 #include <bits/stdc.h> #define rep(i,a,b) for(in…

【模拟】数列

数列 题目大意&#xff1a; 有一个序列&#xff0c;1,11,21,1211,111221,3122111,11,21,1211,111221,3122111,11,21,1211,111221,312211&#xff0c;形如上一个数有x1x_1x1​个x2x_2x2​&#xff0c;x3x_3x3​个x4x_4x4​&#xff0c;把x连起来即为当前数 原题&#xff1a; …

.net core redis 驱动推荐,为什么不使用 StackExchange.Redis

前言本人从事 .netcore 转型已两年有余&#xff0c;对 .net core 颇有好感&#xff0c;这一切得益于优秀的语法、框架设计。2006年开始使用 .net 2.0&#xff0c;从 asp.net 到 winform 到 winservice 等等领域开发都些许涉猎。对.net和大多数同胞有着类似的感触&#xff0c;那…

2018 计蒜之道 复赛

A. 贝壳找房函数最值 常规贪心推式子。按(a-1)/b排序 #include <bits/stdc.h> #define rep(i,a,b) for(int ia;i<b;i) #define frep(i,a,b) for(int ia;i>b;--i) #define mem(W) memset(W,0,sizeof(W)) #define pb push_back typedef long long ll; const int N 1…

看电影

看电影 题目大意&#xff1a; 在一个有n个点的环中选m个人&#xff0c;选中ld号的可能性为多少 原题&#xff1a; 题目描述 听说NOIP2016大家都考得不错&#xff0c;于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影。可是省常中OI队的同学们共有 N&…

[开源]开放域实体抽取泛用工具 NetCore2.1

开放域实体抽取泛用工具https://github.com/magicdict/FDDC更新时间 2018年7月16日 By 带着兔子去旅行开发这个工具的起源是天池大数据竞赛&#xff0c;FDDC2018金融算法挑战赛02&#xff0d;A股上市公司公告信息抽取。这个比赛是针对金融公告开展的信息抽取比赛。在参赛过程中…