spring-boot2.x 集成graphql graphql-java环境搭建

头像
码农笔录
2019-04-17阅读 2062

    介绍GraphQL是什么的文章网上一搜一大把,篇幅有长有短,但是从最核心上讲,它是一种查询语言,再进一步说,是一种API查询语言。这里可能有的人就会说,什么?API还能查?API不是用来调用的吗?是的,这正是GraphQL的强大之处。一般如果是个人项目,改后端接口这种事情可以随意搞,但是如果是公司项目,改后端接口往往是一件比较敏感的事情,尤其是对于三端(web、andriod、ios)公用同一套后端接口的情况。大部分情况下,均是按第二种方式来解决问题的。因此如果接口的返回值,可以通过某种手段,从静态变为动态,即调用者来声明接口返回什么数据,很大程度上可以进一步解耦前后端的关联。


    前端vue整合graphql案例,请访问我的另一篇文章 点击访问


下面两张是案例的效果图,左边是我们的查询条件,右边是我们查询结果,可以看出我们指定查询返回什么字段,就会返回什么字段,不像我们使用restful,会返回一堆你不需要的字段。



一、springboot 整合graphql

我这里用的是gradle,如果各位用的是maven,就手动改造一下。加入以下依赖,如果我们之前有依赖springmvc,只需要加前三个。我这里用的springboot版本是2.1.2

源码是放在coding上的,可以直接下载demo运行 点击访问源码

    implementation 'com.graphql-java:graphql-java:11.0'
implementation 'com.graphql-java:graphql-java-spring-boot-starter-webmvc:1.0'
implementation 'com.google.guava:guava:26.0-jre'
implementation 'org.springframework.boot:spring-boot-starter-web' //springmvc

1.新建schema.graphqls

首先我们在resources下新建schema.graphqls,定义schema,其实可以理解为java中的实体类

Query 里的就是查询接口,bookById根据书的id返回书的详细信息,下面两个是实体,一个是书的属性,关联另一个实体作者。

type Query {
bookById(id: ID): Book
}

type Book {
id: ID
name: String
pageCount: Int
author: Author
}

type Author {
id: ID
firstName: String
lastName: String
}


2.新建DataFetchers

其实可以理解为获取数据的方法,demo是模拟的数据,你们用的时候比如用mybatis或者jpa的,还是原来的方法去数据库查询,然后return回去就好了。

代码地址:https://dev.tencent.com/u/yirenyishi/p/sb-graphql/git/blob/master/src/main/java/com/aiprose/nelson/graphql/GraphQLDataFetchers.java


3.新建GraphQLProvider实例

我们实例一个GraphQL对象,然后读取schema.graphqls文件,其他的是固定的,我们只需要在红框圈起来的地方调用我们的fetcher方法获取数据即可,有人会想我在数据库查出来的属性字段有的是多余的怎么办,不要担心graphql会帮你处理,你无需担心。

Query就是对应schema.graphqls中的query,如果你有多个,换行继续追加即可,下边就是父子关联查询了,这里是根据book查询author。

代码地址:https://dev.tencent.com/u/yirenyishi/p/sb-graphql/git/blob/master/src/main/java/com/aiprose/nelson/graphql/GraphQLProvider.java


3.使用graphql-playground测试

到这里你的graphql服务器就算搭建好了,我们平时用postman测试restful接口,但是这里是不行的,我们用graphql-playground进行测试。

首先我们要安装 graphql-playground 下载地址,安装完后双加打开,输入我们的graphql服务器的地址。



然后在左边输入查询条件,点击中间的运行按钮查询数据,bookById就是在schema.graphqls中Query中定义的。根据id查询,括号里的就是你指定要返回的属性字段

{
bookById(id:"book-2"){
name
}
}

  

变换查询条件,我们让他吧作者信息也带回来

{
bookById(id:"book-2"){
name,
author{
lastName
}
}
}


  

点击右边的两个小按钮,会提示你接口文档和schema的定义。