SpringBoot GraphQL初体验(三): 多个endpoint

  |   0 评论   |   0 浏览

背景

我这里的场景,会授权不同的用户,访问不同的资源。

业务上,是通过SpringBoot的切片方式,实现的根据访问的url来鉴权。

所以期望提供多个endpoint,每个endpoint访问自己的资源。

初体验

这里就没有用 graphql-spring-boot-starter中的提供服务的方法。

根据schema生成GraphQL

InputStream inputStream = GraphQueryService.class.getResourceAsStream("/schema/evaluation.graphqls");
        String schema = IOUtils.toString(inputStream);

        SchemaParser schemaParser = new SchemaParser();
        TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);

        RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring()
                .type("Query", builder -> {
                            // 下面的fieldName,要与schema中的保持一致。
                            builder.dataFetcher("getUserById", env -> {
                                int id = Integer.parseInt(env.getArgument("id").toString());
                                // 下面是自己的从DB中查询数据的方法
                                return queryService.getUserById(id);
                            });
                            return builder;
                        }
                ).build();

        SchemaGenerator schemaGenerator = new SchemaGenerator();
        GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);

        this.graphQL = GraphQL.newGraphQL(graphQLSchema).build();

进行查询

有了graphQL,就可以直接进行查询了。

public Object query(String query){
        ExecutionResult executionResult = this.graphQL.execute(query);
        return executionResult.getData();
    }

这样只要在controller中,调用query方法,就可以得到GraphQL的查询结果了。

参考

  1. API查询语言GraphQL(二)SpringBoot整合Graphql问题拓展