GraphQL是facebook开源的一套数据交互方案,它并不是某种具体的语言或者框架,它只是提供了一套解决方案,这套解决方案经过GraphQL规范进行定义,不一样语言能够有本身的GraphQL实现,目前已经有不少语言完成了GraphQL的实现,能够在这里查看。git
GraphQL致力于提供一种直观的弹性语法系统,用以描述客户端程序设计时的数据需求以及数据交互行为。通俗地讲就是容许客户端在请求中精确的定义本身须要什么,服务端根据客户端的请求精确的返回相应的内容。好比有以下两个相互关联的实体:github
Teacher{
name: String
phone: String
age: Int
}
School{
id: String
name: String
address: String
teachers: List<Teacher>
}
复制代码
使用GraphQL查询指定学校的名称是这样的:后端
school(schoolId: "schoolId1"){
name
}
复制代码
返回:bash
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服务搭建学习
同时,GraphQL提供了强大的开发者工具GraphiQL,能够实时查看数据模型和API,为先后端开发者提供了一个便捷的沟通平台。ui
经过上面的内容,大体能够了解GraphQL给先后端数据交互带来的变化。 使用RESTful风格的API,会从指定接口加载数据。每一个接口都明肯定义了返回的数据结构。这意味着客户端须要的数据,已经在URL中制定好了。GraphQL中采用的方式大相径庭,GraphQL的API一般只暴露一个接口,而不是返回固定数据结构的多个接口。 GraphQL返回的数据结构不是一成不变的,而是灵活的,让客户端来决定真正须要的是什么数据。spa
这样的变化可以在必定程度上解决使用RESTful风格接口完成数据交互时会遇到的问题:
type School {
id: ID!
# 学校id
schoolId: String
# 学校名称
schoolName: String
# 学校年龄
schoolAge: Int
# 学校地址
schoolAddress: String
# 学校包含的老师
teachers: [Teacher]
# 校长
master: String
}
复制代码
GraphiQL中查看:
GraphQL解除了接口和数据之间的绑定,对业务数据模型作了抽象和整理,以图的方式来明确模型之间的关系,经过这些关系,具体业务场景能够定制本身的数据,不一样的业务场景只要基于一样一套基础数据模型就能够复用过往的接口。
以上好处讲起来有些抽象,须要多多实践多多体会。