SpringBoot GraphQL初体验(一): 基础使用
背景
据说GraphQL可以干掉CURD Boy,所以前来尝试下。
GraphQL可以由前端指定需要的接口字段,而后端根据前端的需求自动适配并返回对应的字段。
快速入门
官方Java示例
来自[3],根据 com.graphql-java.graphql-java:18.1
做了微调。
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import graphql.schema.StaticDataFetcher;
import graphql.schema.idl.RuntimeWiring;
import graphql.schema.idl.SchemaGenerator;
import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;
public class HelloWorld {
public static void main(String[] args) {
String schema = "type Query{hello: String} schema{query: Query}";
SchemaParser schemaParser = new SchemaParser();
TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);
RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring()
.type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")))
.build();
SchemaGenerator schemaGenerator = new SchemaGenerator();
GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();
ExecutionResult executionResult = build.execute("{hello}");
System.out.println(executionResult.getData().toString());
// Prints: {hello=world}
}
}
初体验
准备工作
Idea安装插件
安装IDEA的插件GraphQL,方便编写Schema。这个插件以前叫JS GraphQL。
插件支持:
- schema补全,错误高亮
- 语法高亮,格式化,代码折叠,注释,括号匹配
- 执行query
- 多schema
引入POM
在刚刚发布的SpringBoot 2.7中,正式有了spring-boot-starter-graphql (文档不全,还是使用了下面的单独的两个pom)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
注:SpringBoot 2.7和swagger有冲突,我这里暂时把swagger禁用了。
本文最后用了下面的方法。
<!-- GraphQL -->
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-spring-boot-starter</artifactId>
<version>7.0.1</version>
</dependency>
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphql-java-tools</artifactId>
<version>6.0.2</version>
</dependency>
<!-- GraphiQL tool -->
<dependency>
<groupId>com.graphql-java-kickstart</groupId>
<artifactId>graphiql-spring-boot-starter</artifactId>
<version>7.0.1</version>
<scope>runtime</scope>
</dependency>
使用
建立实体类
示例:
@Data
public class UserModel {
@TableId
private Int id;
private String userName;
private String userId;
private Timestamp createTime;
private Timestamp updateTime;
}
编写schema文件
schema命名需要符合 **/schema/*.graphqls
样式。
src/resource/schema/user.graphqls
内容如下:
type Query {
getUserById(id: ID): User
getUsers: [User]
}
type User {
id: Int!
userId:String
}
编写schema对应的QueryService
示例,需要继承GraphQLQueryResolver:
import graphql.kickstart.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserQueryService implements GraphQLQueryResolver {
public UserModel getUserById(int id) {
return xxx; // 查询数据库
}
public List<UserModel> getUsers() {
return xxx; // 查询数据库
}
}
服务端配置
修改application.yaml文件,增加:
graphql:
servlet:
corsEnabled: true
mapping: /graphql
enabled: true
这里可以启动服务端了。SpringBoot会扫描所有实现GraphQLQueryResolver
类的类,然后支持其中定义的查询。
测试客户端工具
ltair GraphQL Client Altair是一个漂亮的GraphQL 客户端,支持MacOS、Windows、Linux、Chrome和Firefox。
打开测试客户端,输入地址:localhost:8080/graphql
,内容示例如:
query {
getUserById(id:11){
id
userId
}
}
点击运行,可以查到结果啦。
进一步使用
使用controller接入请求
可以不使用graphql的servlet,而使用SpringBoot的Controller。
没搞定,待研究。
启用GraphiQL调试页面
application.yaml配置文件,如下:
#GraphiQL Tool
graphiql:
mapping: /graphiql
endpoint:
graphql: /graphql
subscriptions:
timeout: 30
reconnect: false
static:
basePath: /
enabled: true
pageTitle: GraphiQL
props:
resources:
query: /schema/user.graphqls
variables: /schema/user.graphqls
variables:
editorTheme: "solarized light"
headers:
Authorization: "Bearer <your-token>"
然后访问:localhost:8080/graphql