GraphQL(一):GraphQL介绍
GraphQL是什么
GraphQL是facebook开源的一套数据交互方案,它并不是某种具体的语言或者框架,它只是提供了一套解决方案,这套解决方案经过GraphQL规范进行定义,不一样语言能够有本身的GraphQL实现,目前已经有不少语言完成了GraphQL的实现,能够在这里查看。git
怎么使用GraphQL
GraphQL致力于提供一种直观的弹性语法系统,用以描述客户端程序设计时的数据需求以及数据交互行为。通俗地讲就是容许客户端在请求中精确的定义本身须要什么,服务端根据客户端的请求精确的返回相应的内容。好比有以下两个相互关联的实体:github
Teacher{ name: String phone: String age: Int } School{ id: String name: String address: String teachers: List<Teacher> }
使用GraphQL查询指定学校的名称是这样的:后端
school(schoolId: "schoolId1"){ name }
返回:数据结构
data{ "name" : "北京大学" }
若是想要查询学校的名称以及全部老师的名字和电话:框架
school(schoolId: "schoolId1"){ name teachers{ name phone } }
将获得:工具
data{ "name" : "北京大学" "teachers" : [ { "name" : "李老师", "phone" : "13312345678" }, { "name" : "张老师", "phone" : "13312345673" }, { "name" : "王老师", "phone" : "13312345672" } ] }
以上只演示了GraphQL提供的查询(query)功能,GraphQL还支持修改(mutation)和订阅(subscription)。学习
要使得客户端可使用GraphQL的方式请求数据,首先须要在服务端提供GraphQL服务,这里能够查看现有的实现了GraphQL的平台,关于如何搭建GraphQL的服务,请查看GraphQL(二):GraphQL服务搭建spa
同时,GraphQL提供了强大的开发者工具GraphiQL,能够实时查看数据模型和API,为先后端开发者提供了一个便捷的沟通平台。设计
为何要使用GraphQL
经过上面的内容,大体能够了解GraphQL给先后端数据交互带来的变化。 使用RESTful风格的API,会从指定接口加载数据。每一个接口都明肯定义了返回的数据结构。这意味着客户端须要的数据,已经在URL中制定好了。GraphQL中采用的方式大相径庭,GraphQL的API一般只暴露一个接口,而不是返回固定数据结构的多个接口。 GraphQL返回的数据结构不是一成不变的,而是灵活的,让客户端来决定真正须要的是什么数据。code
这样的变化可以在必定程度上解决使用RESTful风格接口完成数据交互时会遇到的问题:
- 多端点,每一个API都有本身的路径须要管理
- API数量庞大,新人自学习困难 GraphQL经过图的方式来组织模型,结合GraphiQL,新人可以快速上手
- 后端数据模型难以规范 RESTful接口多为页面驱动,后端可能会设计不少差异不大的模型,目前并无一种强约束去要求后端开发人员规范模型,GraphQL要求在一开始就完成业务模型的分析和定义,避免后面业务模型的泛滥
- 在API设计时每每是面向页面的,而页面相比模型具备更差的稳定性
- API文档维护工做量大 RESTful的API须要管理大量文档,可是依然存在文档更新、文档查阅方便的问题,虽然能够动用人力完善工具去解决,可是GraphQL自然就自带文档工具特性。咱们在定义字段时,一并写上description,经过GraphiQL能够实时查看:
type School { id: ID! # 学校id schoolId: String # 学校名称 schoolName: String # 学校年龄 schoolAge: Int # 学校地址 schoolAddress: String # 学校包含的老师 teachers: [Teacher] # 校长 master: String }
GraphiQL中查看: 6. 数据聚合较为麻烦 这是在后端常常须要处理的问题,好比,客户端须要一些数据,咱们定义了一个RESTful的接口,可是这些数据分别在A和B服务中,最终咱们会在后台手动聚合A和B的数据到一个模型里返回。而GraphQL经过不一样的Resolver自然完成了数据聚合功能
GraphQL解除了接口和数据之间的绑定,对业务数据模型作了抽象和整理,以图的方式来明确模型之间的关系,经过这些关系,具体业务场景能够定制本身的数据,不一样的业务场景只要基于一样一套基础数据模型就能够复用过往的接口。
以上好处讲起来有些抽象,须要多多实践多多体会。