zoukankan      html  css  js  c++  java
  • GraphQL Java-入门指南

    GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。

    基于node的服务端开发中,GraphQL技术较为成熟常用,在基于java的服务端开发中,由于国内对该API标准的了解程度不高,以及引入GraphQL可能需要维护两份重复数据(schema和相应java代码实现)。目前在Java服务端开发领域,Graphql Java的应用还较为有限。

    本文旨在从Java服务端开发的角度,介绍GraphQL的落地实践。由官方文档开始,循序渐进的介绍引入GraphQL对服务端开发带来的好处,以及基于GraphQL Java框架的注解式声明方式,逐步优化GraphQL的引入流程。

    一、开始

    graphql-java至少需要在java8平台上运行。

    1.1 在gradle中使用

    保证mavenCentral在repo当中

        repositories {
            mavenCentral()
        }
    

    添加依赖如下:

        dependencies {
          compile 'com.graphql-java:graphql-java:13.0'
        }
    

    1.2 在Maven中使用

    依赖如下:

        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-java</artifactId>
            <version>113.0</version>
        </dependency>
    

    二、Hello World示例

    示例代码如下:

    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;
    
    import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;
    
    public class HelloWorld {
    
        public static void main(String[] args) {
            String schema = "type Query{hello: String}";
    
            SchemaParser schemaParser = new SchemaParser();
            TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);
    
            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}
        }
    }
    

    示例中展示了一个最简单的hello world示例,主要包含如下几个部分:

    2.1 Schema

    Schema,可理解为GraphQL的概要,描述了相关的类型信息、可执行的操作等。

    在本例中,我们定义了一个Schema如下:

    type Query{hello: String}
    

    其中,Query类型的操作,只包含一个hello字段,并且返回String类型数据。

    2.2 TypeDefinitionRegistry

    类型定义。在Java代码中,通过加载Schema文件或描述,将其解析为TypeDefinitionRegistry。

    2.3 RuntimeWiring

    运行时织入。仅有Schema及其类型定义还不够,在Java中要实际运行GraphQL`,还需要显式指定定义中的每个操作,该触发什么样的行为。

    例如,在本例中,builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")表示当查询Query类型下的hello字段时,返回值为"world"。

    2.4 GraphQL

    在结合前面TypeDefinitionRegistry和RuntimeWiring的基础上,生成的可运行的GraphQL实例。

    2.5 ExecutionResult

    每次执行GraphQL操作时,返回的结果对象。其中包含error字段,用于保存执行过程中的报错信息。data字段,用于获取执行结果返回值。

  • 相关阅读:
    路径变量@PathVariable/请求参数@RequestParam的绑定以及@RequestBody
    JSR303后端校验详细笔记
    创建ssm项目步骤
    利用 R 绘制拟合曲线
    在 Linux 中将 Caps 根据是否为修饰键分别映射到 esc 和 Ctrl
    Master Transcription Factors and Mediator Establish Super-Enhancers at Key Cell Identity Genes
    Genomic Evidence for Complex Domestication History of the Cultivated Tomato in Latin America
    Variation Revealed by SNP Genotyping and Morphology Provides Insight into the Origin of the Tomato
    The genetic, developmental, and molecular bases of fruit size and shape variation in tomato
    微信支付jsapi
  • 原文地址:https://www.cnblogs.com/pku-liuqiang/p/11496914.html
Copyright © 2011-2022 走看看