简介
GraphQL 和 RESTful 都是一种前后端通信规范,用于数据查询的网站架构方案。GraphQL 是 Facebook 于 2012 年在内部开发的数据查询语言,在 2015 年开源,旨在提供 RESTful 架构体系的替代方案。二者都是基于 HTTP 进行数据的请求与接收,而 GraphQL 相比于 RESTful,它可以在客户端请求中指定查询的数据,而 RESTful 需要先在服务端进行 API 的定义。所以二者有很多相同的地方,也有一些不一样的地方,下面从请求资源、请求路由和请求处理三个方面进行 GraphQL 和 RESTful 的对比。
请求资源
对于一个 API 请求,核心的内容就是资源,也就是通过请求服务端返回的响应数据结果。RESTful 的核心思想就是每一个资源都可以通过一个 URL(包含请求路径和参数)来表示,举个例子,我们可以通过一个 GET 请求来获取到相应的数据:一个 GET 请求,运行之后获取的返回响应(示例工具:Apifox)
在上面的例子中我们可以看到,一个资源和如何请求获取数据是关联在一起的,上面的例子实际上就是一个“Query 端点”。我们需要预先定义好返回的数据模型,这样请求的时候才能获取服务端返回的数据。
而 GraphQL 就不太一样,在 GraphQL 里面,请求和数据模型的定义实际上是分离的,你可以在服务端定义多个数据模型,请求的时候也可以针对服务端不同的数据模型进行查询。比如还是上面的例子(示例工具:APOLLO),在服务端定义了 Query 的数据模型:
如果需要请求 Query 这个数据模型,在服务端 schema 中创建一个 Query 类型:
然后,前端就可以发起请求了:
可以看到,GraphQL 和 RESTful 都是通过请求某 个URL 得到服务端的数据响应,但是在请求资源上,差异还是很明显的。在 RESTful 中,资源的返回内容是由服务端预先定义并决定的,而在 GraphQL 中,服务端只是负责定义可用的资源,具体需要什么资源是客户端通过字段自己来决定的。
请求路由
不管是 GraphQL 还是 RESTful,设计一个好的 API 必须是可预见的,看到这个 API 的定义就可以知道预期会得到什么样的结果。对 API 的描述,对请求参数的描述以及对返回响应的定义等都是在 API 定义中非常重要的部分。
对于 RESTful 请求,我们可以看一下下面的例子:示例工具:Apifox
而在 GraphQL中,我们是可以定义数据模型和在 schema 中定义需求的请求,如下面的例子:示例工具:Apifox
服务端数据模型和请求的定义:
客户端发起的请求定义:
总的来说,RESTful 通过定义好 API 的各个描述,路径、参数和响应来展示完整的请求,而 GraphQL 在客户端和服务端对于请求的描述可以分开定义。
请求处理
最后,对于 GraphQL 和 RESTful 的请求,在请求处理过程中,有什么不同呢。
不管是 GraphQL 还是 RESTful 请求,都是通过请求一个 URL,然后服务器端来处理这个请求并返回相应的数据。
对于 RESTful 请求:
- 服务器接收到请求并提取出请求的方法(比如上面例子中说的 GET 方法)和 URL 路径。
- 服务端框架层找到相关的 API 的代码和方法。
- 通过执行代码来获取请求的数据结果。
- 服务端框架将请求结果进行封装之后,返回给客户端。
对于 GraphQL 请求:
- 服务器接收 HTTP 请求,提取对应的 GraphQL 的查询信息。
- 服务端通过解析查询语句,调用针对查询语句里面每一个字段的解析器(Resolver)。
- 解析器函数被执行之后得到查询的数据结果。
- GraphQL 框架把请求结果进行封装之后,返回给客户端。
总结
这篇短文中很多涉及到 GraphQL 和 RESTful 的一些细节和深入的点并没有细说,但是通过本文可以通俗地了解到这两大 API 请求协议的共同点和差一点,很多概念上其实都是相通的。
主要的不同点其实就是:
- RESTful 一个 API 通过一个 URL 来请求返回一个资源,而 GraphQL 一个 API 请求可以获取多个资源;
- RESTful 是通过 URL 来区分资源的,而 GraphQL 则是通过数据类型来区分资源的;
- GraphQL 可以通过客户端查询的定义来精准地获取想要得到的数据结果,而 RESTful 的结果是服务端实现来定义的。
目前工具和插件层面,RESTful 是占据一定优势的,但是 GraphQL 也在迎头追赶。大家可以通过例子中的工具来进行体验:Apifox
知识扩展: