首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

两分钟 GraphQL:或许是个不错的选择

按照官方的定义,GraphQL 是一门数据查询语言,是属于 API 设计领域的技术。

在 API 设计领域,我们知道 RESTful 的方式,其针对一个资源,对外暴露增删改查等操作,另外还有一个指向该资源的唯一地址。可以看到,RESTful 的方式,每次只能操作一个资源,如果要一次操作多个相互关联的资源,就需要发起多个请求,这无疑会造成网络开销。

和 RESTful 方式一致,GraphQL 其实也是面向资源的,不同的是其允许一次获取多个资源,面向资源集,如下图所示。所以官方才敢说 GraphQL is the better REST。

根本来看,GraphQL 是一套规范(specification),定义了数据如何被暴露和被获取,类似从数据库里查询你想要的数据,GraphQL 设计了一套自己的语法,来帮助你描述想要的数据,当然,这时候过滤就是必不可少的功能了。

不同语言针对这套规范有不同实现,官方称之为服务端运行时(server-side runtime),其主要工作就是构建这整套“语法”,也就是类型系统(type system)。GraphQL 是一套类型系统,而且是强类型系统(strong-typing),就像 Java 是一套类型系统,其意味着高效的错误检查和类型预期,可以避免手工解析数据等,但同时也意味着灵活性的降低。

好,我们来看一个具体的基于 Node.js 的例子(也是官方示例):

可以看出 GraphQL 不依赖于具体的数据源,因为每个字段具体返回什么值,是我们自己实现的,你可以直接返回字符串,也可以去查询一个关系型数据库,稍作处理,再返回,等等,由你而定。

这就意味着,GraphQL 是以一种附着的方式,参与到我们的既有项目的,它不会破坏你的既有结构,它是一种非侵入的方式。

我们再来看一个稍复杂点的例子(也是官方示例),真正模拟服务端和客户端交互的过程,服务端是通过 Express 实现, Express 通过 GraphQL 来提供对外接口:

Express 的具体细节,不需要在这里关注,我们只需要理解基于 GraphQL ,客户端和服务端是如何协同工作的就行。我用 Postman 发送一个 GET(也可以是 POST) 请求给 Express,同时把查询(GraphQL query)传给服务端,即参数 query=。服务端得到外部传入的查询,再结合 schema 和数据对象的定义,返回我们请求的数据。

需要强调的是,虽然我们的第二个例子是用的 Express 作为服务器,但 Express 并不是唯一选择,你可以用任何你想用的服务器,之上加入 GraphQL 的支持,如上所说, GraphQL 是一种非侵入的方式 。

另外,官方还提到一些使用 GraphQL 带来的好处,比如:

不再需要版本控制你的 API;

可以在不影响现有查询的情况下,新增字段;

单一入口

避免数据冗余

也支持增删改

但都不是决定性的了。真正决定性的还是一次请求可以返回丰富的数据集,而且,这个数据集还是有章可循的。

标题图:Photo by Imran Creator on Unsplash

GraphQL:https://graphql.org/

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190110G1GB3E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券