GraphQL 官网 https://graphql.cn/
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。
SpringBoot 集成
1. 在 pom.xml 引入依赖:
<!-- 必需:包含了默认配置、graphql-java 和 graphql-java-tools,可以简化配置 -->
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>11.0.0</version>
</dependency>
<!-- 可选:用于调试 GraphQL,功能类似 Restful 中的 Swagger -->
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>playground-spring-boot-starter</artifactId>
<version>11.0.0</version>
</dependency>
2. Application 配置
如果第1步没有引入playground-spring-boot-starter依赖,而是使用浏览器的 GraphQL Playground 插件调试 GraphQL,则还需要关闭跨域。如下 application.yml 文件:
参考 https://github.com/graphql-java-kickstart/graphql-spring-boot#enable-graphql-servlet
graphql:
servlet:
# 关闭跨域,仅使用浏览器插件调试时设置为false
corsEnabled: false
playground:
cdn:
# playground 使用 cdn 的静态文件
enabled: true
3. 模拟查询
1. 首先定义实体对象
@Data
public class Question {
private Long id;
private String title;
private String content;
private Integer userId;
}
2. 由于主要是围绕 GraphQL 来做讲解的,这里假设查询的 Service 如下:
@Service
public class QuestionService {
public Question selectById(long id) {
Question question = new Question();
question.setId(1L);
question.setContent("how old are you?");
question.setTitle("age");
question.setUserId(140023);
return question;
}
}
3. 编写查询的 Resolver
定义一个 Resolver,实现 GraphQLQueryResolver 接口
@Component
public class Query implements GraphQLQueryResolver {
@Autowired
private QuestionService questionService;
public Question getQuestionById(long id) {
return questionService.selectById(id);
}
}
4. 编写 schema.graphqls 注意后缀必须是 .graphqls
- 为什么需要 schema ?
- 每一个 GraphQL 服务都会定义一套类型,用以描述你可能从那个服务查询到的数据。每当查询到来,服务器就会根据 schema 验证并执行查询。
- 通俗的讲就是你的查询能返回什么样的数据。
type Query {
questionById(id: ID): Question
}
type Question {
id: ID
title: String
content: String
userId: Int
}
5. 启动测试
在浏览器地址栏中输入 http://localhost:8080/playground,输入以下查询命令:
就能看到返回的Json数据。
{
questionById(id: 1) {
id
title
content
userId
}
}
查询结果:
{
"data": {
"questionById": {
"id": "1",
"title": "age",
"content": "how old are you?"
}
}
}
Tips:
增加查询的数据和修改查询的字段,就能理解 schema
的用处了,前端输入的查询熟悉不在我们的规定范围内的话是不能进行查询的,schema
帮助我们约束了查询的条件和规范化。同时也定义了查结果的结构。