SpringBoot GraphQL初体验(一): 基础使用

  |   0 评论   |   0 浏览

背景

据说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

参考

  1. 实战,Spring Boot整合GraphQL实现动态字段接口!
  2. GraphQL入门基础篇教程
  3. GraphQL快速入门
  4. Getting Started with GraphQL and Spring Boot