- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章再见 REST,你好 GraphQL由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
写过前端的都知道,REST 风格的 API 适合简单的增删改查。对于稍微复杂的关联查询,就显得不太合适:如果设计一个 REST 接口,一般情况下会返回关联表的全部字段,以满足更多类似的查询需求,如果设计多个细粒度接口,前端就需要查询很多次,自己拼装数据。粗粒度的接口导致不必要的数据传输,细粒度的接口导致函数爆炸,你见过 JavaScript 的 Promise 满天飞吧.
在此情景下 Facebook 的工程师于 2015 年开源了 GraphQL 规范,让前端自己描述自己希望的数据形式,服务端则返回前端所描述的数据结构。简单的来说,前端要啥,后端就返回啥,非常灵活.
什么是 GraphQL?
简单来说,GraphQL 是一种面向数据的 API 查询风格,把所有数据都视为已连接的图形,客户端能够准确地获得它需要的数据,没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具.
比如,前端只需要 hero 的 name,那么后端就只返回这个 name,没有冗余:
再比如:前端需要显示作者的帖子信息,作者本人的信息,作者的关注者列表,假如是 REST,前端需要请求这三个接口,再组装:
现在我们可以通过 GraphQL 的一次查询拿到全部信息,无需从好几个异步 API 里面来回找:
简洁明了,不是吗?
GraphQL 带来的改变 。
目前应用开发的主流就是前后端分离,前后端只通过 API 来交流,结构大概如下图:
如果使用 GraphQL,那么后端将不再生产 API,而是将 Controller 层维护为 Resolver,和前端约定一套 Schema,这个 Schema 将用来生成接口文档,前端直接通过 Schema 或生成的接口文档来进行自己期望的请求.
经过几年一线开发者的填坑,已经有一些不错的awesome-graphql(https://github.com/chentsulin/awesome-graphql)用于开发与生产,很多语言也提供了对 GraphQL 的支持,比如 JavaScript/Nodejs、Java、PHP、Ruby、Python、Go、C# 等.
GraphQL 的使用趋势 。
一些比较有名的公司正在转换 REST API 到 GraphQL,比如 Twitter、IBM、Coursera、Airbnb、Facebook、Github、携程等,特别是 Github,它的 v4 版外部 API 只使用 GraphQL。据一位在 Twitter 工作的大佬说硅谷不少一线二线的公司都在想办法转到 GraphQL 上,但是同时也说了 GraphQL 还需要时间发展,因为将它使用到生产环境需要前后端大量的重构,这无疑需要高层的推动和决心.
GraphQL 的局限性 。
对于简单的应用程序而言,设置类型、查询等可能会有些复杂,相比之下 REST 可以更轻松完成.
对于复杂的查询,GraphQL 只需要一次接口请求,这样虽然网络层面的请求数被优化了,但是数据库层面的查询可一点都不少,数据库查询可能会成为性能瓶颈,还有很大的优化空间.
GraphQL 的优势 。
检索精确的数据,没有冗余。通常,当数据需求发生变化时,您只需要修改查询,并且不需要太多更改,从而提高前后端的开发效率,可以快速进行产品迭代.
最后的话 。
GraphQL 已经被各种体量的团队所使用,在不同的环境、不同的语言下,用于增强移动应用、网站和 API。如果你已经厌倦了 REST API,现在是时候学习一下 GraphQL 了。关注公众号「Python七号」,学习更多技术干货.
原文地址:https://mp.weixin.qq.com/s/QYK3eRh4ieJFAR873CkwaA 。
最后此篇关于再见 REST,你好 GraphQL的文章就讲到这里了,如果你想了解更多关于再见 REST,你好 GraphQL的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
计算时IO (IO ()) , 两个 (IO ())和 ()是计算出来的,所以为什么 main :: IO (IO ()) main = print (print "Hello, World!")
我的球代码在这里:我不知道如何让球撞到墙上时变色。如果我们想在球每次从墙上弹起时随机改变它的颜色该怎么办? //Ball.java import java.awt.Color;
我正在关注官方的 Go 教程:https://golang.org/doc/code.html 但我没有通过命令行做事,而是使用 GoLand。当所有内容都包含在 HelloWorld.go 包中时,
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
这个问题已经有答案了: Is Java "pass-by-reference" or "pass-by-value"? (91 个回答) 已关闭 4 年前。 我已经尝试过像 c(procedure)
我将我的网站作为 centerdownload.net 放在网上,但是当我创建 mysql 数据库时,所有页面的浏览器中都会出现错误: Warning: mysql_connect () [funct
我正在查询数据库。 就我而言,每个用户每天都会有 5 条记录保存在表中。因此,在 10 天内,一个用户将有 50 条记录。我有 50000 个用户,每天的记录数为 50000*5=250000 条记录
在我当前的表中,我有日期列,从该列我可以找到工作日。通过使用 to_timedelta 我创建了 week_start 列,但它没有给出正确的日期。代码如下: final_data['weekday'
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于Nginx扩展 以欣宸自己为例,对一个java程序
我想知道bonjour是公共(public)API还是私有(private)API?我们可以直接在我们的应用程序中使用它吗? 最佳答案 Bonjour 由 NSNetServices 和 CFNetS
我编写了以下代码来获取 6 个数字作为输入,然后计算它们的平均值: import java.util.Scanner; class FinalGrade { public static void ma
出现拼写错误并将定价错误地输入为定价 我已经删除了应用程序,删除了数据库中的表,然后让新应用程序从旧应用程序复制了 models.py,我做了备份,那么这里的错误仍然存在是管理面板 这里是 mod
我理解用于确定某件事是否是闰年的代码行,并且我已经看到了用于确定数字总和的代码行,但我不知道如何将两者结合起来。当我运行它时,我收到一条错误消息 In function "main": error.
我在 nodejs 中有一个 api 来获取数据我需要一个 token 授权,但我不知道该怎么做? $(document).ready(function() { $.getJSON("http
教程中的代码有几个问题:ListView Tutorial .给我带来问题的代码 fragment 是: static final String[] COUNTRIES = new String[]
我一直在这个 link 查看 Hello MapView , 但它已经宕机几天了,所以我会在这里问我的问题: 我添加了一个看起来像标记的叠加项。我想根据更新后的位置移动标记。有什么方法可以定位现有标记
我正在尝试位于 here 的教程 我已经为 openCV 编译了示例代码,没有任何问题 - 所以我确定我已经为 opencv 安装了所有必要的东西。我已经将 opencv 库添加到我的项目中,并且我正
错误是:至少对一个 JAR 进行了 TLD 扫描但不包含 TLD。为这个记录器启用调试日志记录,以获得已扫描但未在其中找到 TLD 的 JAR 的完整列表。在扫描期间跳过不需要的 JAR 可以缩短启动
此函数旨在用第一个字符串的过滤结果填充第二个字符串。过滤器应该删除所有特殊字符,只打印所有字母的小写排列 我试过改变“ModifyText”循环的性质,我用指针+while 循环和 for 循环完成了
当我将 .php 文件更改为 .blade.php 时出现错误。在我更改它之前出现此错误。 Route::get('hello','HelloController@index'); 你好 Contro
我是一名优秀的程序员,十分优秀!