GraphQL是一种查询语言和执行引擎,通过API描述应用程序数据模型的功能和需求。年由Facebook提出并实现,最初用在移动端,在年对外发布。于年成立GraphQL基金会发展至今。
简介GraphQL可以类比SQL(StructuredQueryLanguage),都是一种查询语言,通过查询语句可以获得期望结果。不同之处有两点:
SQL是基于结构化的数据模型,而GraphQL基于图。
SQL是从数据库查询,而GraphQL从服务器查询。
为什么GraphQL基于图?因为大多数应用程序数据模型基于图。以博客系统为例,一个作者可以撰写多篇博客,同一个博客也可以由多个作者共同完成,如果两个作者写过同一篇博客,那么他们互为合作者。博客和作者是实体,属于图的节点。作者和博客之间(多对多)的关系,属于图的边。特别的,实体和他们属性之间的关系也属于边,属性内容为叶子节点。如下图所示:
很明显这是一个双向循环图,GraphQL就是基于这种典型的图模型,来构建和查询数据。
核心概念GraphQL构建在API之上,通过API在客户端——服务器端交换数据,它使用一个模式定义语言(TheSchemaDefineLanguage)来描述对数据的增删查改。
模式定义语言TheSchemaDefineLanguage(SDL)GraphQL是如何来描述应用程序数据模型的呢?它使用类型系统来描述实体,使用类型之间的关系来描述实体之间的关系。比如文章开始的博客系统,对应Schema如下:
typeBlog{id:IDtitle:Stringurl:Stringauthors:[Author]}typeAuthor{id:IDname:Stringcoauthors:[Author]blogs:[Blog]}定义了两个类Blog和Author来描述博客和作者这两个实体,用属性相互引用来表示博客和作者之间多对多的关系。
查询数据简单博客应用程序的数据模型是一张图,一张双向循环图。对于复杂的大型应用程序,它的数据模型可能包含成百上千个节点和边,一次查到整张图显然是不合适的。GraphQL需要确定两件事:
查询的入口
如何遍历图以获取数据
它通过定义Query来实现。Query的不同方法(Resolver)确定了查询的入口和遍历的方法。如果你想查询系统中所有博客,你可以:
直接找到博客节点查询,例如:
对应的查询语句如下:
query{blogs{titleurl}}查询结果为:
{"data":{"blogs":[{"title":"GraphQL","url":"