GraphQL 是什么这里我们就不做描述,想了解的可以直接点击链接查阅。
我们直接说明如何在 Spring Boot 框架中使用 GraphQL。
只需要在 pom.xml 引入一个依赖就可以了:
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>11.0.0</version>
</dependency>
这个依赖已经包含了 graphql-java 和 graphql-java-tools 等组件,不需要额外引用其他依赖,配置也很简单,而且目前持续在更新。
打开 application.yml 文件,加入如下配置:
graphql: servlet: enabled: true mapping: /graphql corsEnabled: false
如果只是刚开始测试,这里要一定要设置 corsEnabled: false 关闭跨域,不然无法请求。实际中再根据需要开关跨域配置。
更多配置请参考《Enable GraphQL Servlet》。
创建文件:src/main/resources/graphql/schema.graphqls,注意文件后缀必须是 .graphqls。内容:
type Query { questionById(id: ID): Question } type Question { id: ID title: String content: String userId: Int }
这了定义了一个查询,名为questionById,其参数一个ID类型的id。
创建文件:src/main/java/org/termi/community/resolver/Query.java,内容:
package org.termi.community.resolver; import graphql.kickstart.tools.GraphQLQueryResolver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.termi.community.model.Question; import org.termi.community.service.question.QuestionService; @Component public class Query implements GraphQLQueryResolver { @Autowired private QuestionService questionService; public Question getQuestionById(long id) { return questionService.selectById(id); } }
这里的 getQuestionById 对应 schema 文件中的 questionById这个Query。
同时,我们要查询数据,所以注入了 QuestionService,具体的查询功能需要自己实现,必须要返回一个Question对象。
package org.termi.community.model; @Data public class Question { private Long id; private String title; private String content; private Integer userId; }
启动 Spring Boot。
在 Chrome 浏览器中安装 GraphQL Playground for Chrome 插件,输入以下内容,点中间的执行按钮就可以看到结果了。
当然,我们也可以在项目中加入 playground 依赖,这样就可以像 Swagger 一样,只要启动项目,就能进行测试了。
首先,pom.xml 中加入依赖:
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>playground-spring-boot-starter</artifactId>
<version>11.0.0</version>
</dependency>
然后配置 application.yml,静态文件使用 CDN方式:
graphql: # 其他配置 playground: cdn: enabled: true version: latest
再重启Spring Boot,浏览器输入:http://localhost:8080/playground,就能看到和GraphQL Playground for Chrome 插件一模一样的界面了。
拥有类似作用的还有 graphiql 和 voyager,具体可参项目介绍的《Documentation》。
参考资料: