特点:
1.请求需要的数据,不多不少。(Restful会返回所有的数据)
2.获取多个资源,只用一个请求
3.描述所有可能类型的系统,便于维护。
GraphQL与restful的对比
1.restful一个接口只能返回一个资源,graphql一次可以获得多个资源
2.restful用不同的url来区分资源,graphql用类型区分资源
使用express+GraphQL需要注意
构建schema,这里定义查询的语句和类型
var schema=bulidSchema(
type Query{
hello: String
}
);
定义查询所对应的resolver,也就是查询对应的处理器
var root ={
hello :() =>{
return "Hello world!";
},
};
Fields:查询一个对象的字段
1.在对象上面选取字段,如果返回的还是对象,那么可以在这个字段里面进行查询。在restful里面查询可能就会返回所有的字段。
2.还可以进行嵌套查询
举例
查询条件
{
hero{
name
friends{
name
}
}
}
返回的数据
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
Arguments:使用查询参数筛选结果
原始数据库查询:select *from Customers where country=‘Meico’
Graphql查询
{
human(id:"1000"){
name
height
}
}
Graphql结果
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 1.72
}
}
}
hero同名查询需要重命名字段避免冲突
举例
{
empireHero:hero(episode:EMPIRE){
name
}
jediHero:hero(episode:JEDI){
name
}
}
{
"data": {
"empireHero": {
"name": "Luke Skywalker"
},
"jediHero": {
"name": "R2-D2"
}
}
}
Fragments:复用查询片段
{
empireHero:hero(episode:EMPIRE){
... heroFields
}
jediHero:hero(episode:JEDI){
... heroFields
}
fragment heroFields on Character
{
name
appearsIn
friends{
name
}
}
}
Operation Name:给你的查询起个有意义的名字
query HeroNameAndFriends
{
hero{
name
friends{
name
}
}
}
mutation:修改数据(同一个数据查询修改后的数据)
举例:
mutation{
createReview(episode:JEDI,review:{stars:3}){
episode
stars
}
}
{
"data": {
"createReview": {
"episode": "JEDI",
"stars": 3
}
}
}
Inline Fragments:用内联片段查询具体类型
{
search(text:"an"){
__typename
... on Human{
name
height
}
... on Starship{
name
length
}
}
}