GraphQL|青训营笔记

84 阅读2分钟

GraphQL|青训营笔记

近年来,由Facebook开发的GraphQL在网络应用和服务器之间的通信中变得流行起来。

GraphQL的理念与REST非常不同。REST是基于资源的。每个资源,例如一个用户,都有自己的地址来识别,例如 /users/10。对资源进行的所有操作都是通过对其URL的HTTP请求完成的。该操作取决于所使用的HTTP方法。

REST的基于资源的特性在大多数情况下都很好用。然而,它有时也会有点尴尬。

如果服务器实现了REST API,我们可能需要从浏览器中进行多次HTTP请求,才能得到我们想要的所有数据。这些请求也会返回很多不必要的数据,而且浏览器上的代码可能会相当复杂。

如果这是一个经常使用的功能,可以有一个REST端点来实现。然而,如果有很多这样的场景,为所有这些场景实现REST端点将变得非常费力。

GraphQL服务器非常适用于这类情况。

GraphQL的主要原理是,浏览器上的代码形成一个描述所需数据的查询,并通过HTTP POST请求将其发送到API。与REST不同,所有GraphQL查询都被发送到同一个地址,其类型是POST。

GraphQL查询和返回的JSON对象之间存在着直接的联系。我们可以认为,查询描述了它想要什么样的数据作为响应。

与REST查询的区别是明显的。在REST中,URL和请求的类型与返回数据的形式没有关系。

GraphQL查询只描述了在服务器和客户端之间移动的数据。在服务器上,数据可以以任何我们喜欢的方式组织和保存。

尽管它的名字很像 SQL,GraphQL实际上与数据库没有任何关系。它并不关心数据是如何被保存的。

GraphQL API使用的数据可以被保存到关系数据库、文档数据库或其他服务器,GraphQL服务器可以通过REST等方式访问。

服务器知道要准确地送回查询所需的字段。那是怎么发生的呢?

GraphQL服务器必须为模式中每种类型的每个字段定义解析器。

通过GraphQL,可以将多个Query类型的字段,或 "单独的查询 "结合到一个查询中。

我们可以通过使用Axios来处理React应用和GraphQL之间的通信。然而,在大多数情况下,这样做是不太明智的。使用一个能够抽象出不必要的通信细节的高阶库是一个更好的主意。目前,有两个不错的选择,Facebook的RelayApollo Client