目录
介绍
什么是GraphQL?
GraphQL的基础知识
GraphQL的好处
更好的数据检索
更好的版本控制
更好地控制响应数据
汇总数据
重要资源
结论
介绍GraphQL这个词在网络上不断涌现。在许多技术活动中也提到过,最新的是AWS re:Invent 2017,他们发布了AppSync,一个完全托管的GraphQL服务。
为什么GraphQL突然在开发者社区中引起涟漪,它的崛起如何影响科技世界?
虽然该名称可能误导您相信它是一种查询语言,但它是REST(及其备用版本)的替代品。我已经为想要了解GraphQL的人编写了关键要点。
为了帮助您更好地理解和突出差异,我已经使用REST和HTTP包含了插图示例。
什么是GraphQL?GraphQL由Facebook于2012年内部开发,并于2015年10月向公众发布。在Facebook术语中:GraphQL是一种查询语言,旨在通过提供直观,灵活的语法和系统来描述其数据需求和交互,从而构建客户端应用程序。它提供了一种语言,用于查询后端数据并更改数据。
简而言之,GraphQL是一种由Facebook创建的查询语言,它指定如何从API请求数据。
GraphQL的基础知识GraphQL有3个高级操作:
- 查询——用于获取数据,如REST中的GET方法
- 突变——在获取后用于创建/修改数据,如REST中的POST,PUT,DELETE方法
- 订阅——用于接收来自服务器的数据更新的长连接,例如Web套接字
这些操作通过定义API功能的模式公开。模式由类型组成。开发人员定义的模式决定了GraphQL API的功能。
每个GraphQL API都有两种类型:
- 根类型,例如查询,突变,订阅
- 用户定义的类型,例如待办事项,人类,动物等。
每个GraphQL API都有一个query类型,可能有也可能没有突变和订阅类型。根类型确定GraphQL查询的入口点。
示例查询:
{
human(id: 101) {
name
age
}
}
以上查询执行以下操作:
- 从root对象开始
- 我们选择带有id 101字段的human
- 对于hero返回的对象,我们选择name和age字段
查询的结果将是:
{
"data": {
"human": {
"name": "John Doe",
"age": 20
}
}
}
要使上述查询起作用,我们必须向模式添加一个人类类型,该模式由它可以返回的字段组成。根查询和人类的类型如下:
type Human {
name: String!
age: Int!
}
type Query {
human(id: ID!): Human
}
类型的字段需要返回一些数据。这发生在GraphQL中。API是通过一个称为GraphQL解析器的概念实现的。这是一个调用数据源或调用触发器返回某个值(例如单个记录或记录列表)的函数。
解析器可以具有多种类型的数据源,例如NoSQL数据库,关系数据库或REST API。我们可以汇总来自多个数据源的数据并返回相同的类型,混合和匹配以满足您的需求。
将模式连接到解析程序函数后,客户端应用程序可以发出GraphQL查询,或者可选地发出突变或订阅。我相信你已经开始看到GraphQL与其前身和其他常用数据库的不同之处。
但是,它有实际的好处吗?让我们来看看。
GraphQL的好处 更好的数据检索查询数据非常简单,减少了到服务器的往返次数。考虑一个包含内容,评论等的博客。每个评论都可以有描述和用户,每个用户都会有姓名,电子邮件,博客列表。
想象一下,我需要博客内容和评论,评论的用户和该用户的博客。为实现这一目标,我们必须进行以下REST调用。
GET - api/vi/blogs/101/ -> will return the blog with its contents
GET - api/v1/blogs/101/comments -> will return the comments of the blog
GET - api/v1/users/30/blogs -> will return the blogs of the user
假设我们有4个评论,因此N = 4,所以需要进行的调用数是步骤1 +步骤2 +步骤3 x 4,其计算结果为6个调用。我们需要在博客上发表评论的所有用户的博客,因此步骤3必须多次执行N次,具体取决于用户数量。
现在,使用以下查询使用GraphQL时,可以在1次调用中存档完全相同的内容:
{
blog(id: 101) {
content
comments {
content
users {
name
email
blog {
content
}
}
}
}
}
您是否注意到我们如何用一个简单的逻辑替换几行代码?
更好的版本控制在REST API中,如果资源中存在新字段或某些更改,则必须创建新版本的端点。这会导致管理更多代码,另一个端点并在弃用后删除旧端点。
GraphQL通过允许用户在动态地向类型添加新字段时保持相同的端点而不破坏任何现有的内容来解决这个问题。
更好地控制响应数据考虑我们有一个响应式Web应用程序使用的API。根据应用程序打开的设备,屏幕上显示的数据会有所不同,某些字段可能隐藏在较小的屏幕设备上,所有字段可能会显示在屏幕较大的设备上。
以下信息图解释了与使用REST时返回的管理数据相关的各种难点:
使用GraphQL,只需根据设备查询所需的字段即可。前端控制着它请求的数据,并且任何GraphQL API都可以使用相同的原则。
汇总数据使用GraphQL,我们可以轻松地聚合来自不同来源的数据,并在一个保护伞下为用户提供服务,而不是从前端或后端进行多次REST调用。我们可以通过统一的API公开遗留系统。
如上所述,每个GraphQL API都由类型、模式和解析器组成。为了创建API,我们需要以某种语言创建GraphQL服务器。如您所知,GraphQL本身就是一种语言并且具有规范,规范必须以编程语言实现才能使用。
几乎所有现代编程语言现在都可以使用GraphQL规范的实现,因此可以非常顺利和轻松地实现集成和迁移。
重要资源作为一名程序员,我相信你很想尝试使用GraphQL。我编写了一些有用的工具和库,您可以利用这些工具和库来使GraphQL更加有趣。
- graphql——JS中GraphQL的一个实现
- Apollo——GraphQL的工具包。它具有多个平台的服务器实现
- Prisma——将数据库转换为GraphQL API的工具。它支持多个数据库
- Scaphold——托管的GraphQL后端
- AWS AppSync——托管的GraphQL服务器,完全托管AWS并连接到多个数据源
GraphQL非常强大并且具有很大的潜力,但它仍然处于起步阶段。然而,在很短的时间内,它已经获得了很大的吸引力,并被社区广泛采用。
显而易见的流行显示了易用性和GraphQL的重要性。我在这里讨论的好处只是我在第一次使用它时遇到的一些好处。
随着系统的发展,我相信会有更多的东西没有被开发出来——有一个巨大的生态系统可以利用GraphQL。
有关GraphQL的完整视频,请访问https://youtu.be/vr2PiivOPZQ。