spring boot 使用GraphQL


在此之前需要簡單了解GraphQL的基本知識,可通過以下來源進行學習

GraphQL官方中文網站 :https://graphql.cn

GraphQL-java 官網: https://www.graphql-java.com

使用GraphQL需要

  定義對象模型

  定義查詢類型

  定義查詢操作 schema

#對應的User定義如下
schema {    #定義查詢
    query: UserQuery
}
type UserQuery {    #定義查詢類型
    user(): User    #指定對象以及參數類型
}
type User { #定義對象
    id: Long!   #!表示非空
    name:String
    age:Int
}

java使用GraphQL需要引入GraphQL-java的依賴

        <!-- The dependence of graphql-java -->
        <dependency>
            <groupId>com.graphql-java</groupId>
            <artifactId>graphql-java</artifactId>
            <version>11.0</version>
        </dependency>

對應的User

public class User {
    private int age;
    private long id;
    private String name;

    public User(int age, long id, String name) {
        this.age = age;
        this.id = id;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

操作靜態數據

import clc.bean.User;
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.Scalars;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;
import graphql.schema.StaticDataFetcher;

/**
 * ClassName: GraphQLDemo<br/>
 * Description: <br/>
 * date: 2019/6/28 10:40 AM<br/>
 *
 * @author chengluchao
 * @since JDK 1.8
 */

public class GraphQLDemo {
    public static void main(String[] args) {
        //定義對象
        GraphQLObjectType userObjectType = GraphQLObjectType.newObject()
                .name("User")
                .field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString))
                .build();
        //user : User 指定對象及參數類型
        GraphQLFieldDefinition userFileldDefinition = GraphQLFieldDefinition.newFieldDefinition()
                .name("user")
                .type(userObjectType)
                //靜態數據
                .dataFetcher(new StaticDataFetcher(new User(25, 2, "CLC")))
                .build();
        //type UserQuery 定義查詢類型
        GraphQLObjectType userQueryObjectType = GraphQLObjectType.newObject()
                .name("UserQuery")
                .field(userFileldDefinition)
                .build();
        //Schema 定義查詢
        GraphQLSchema qlSchema = GraphQLSchema.newSchema().query(userQueryObjectType).build();

        GraphQL graphQL = GraphQL.newGraphQL(qlSchema).build();
        String query = "{user{id,name,age}}";
        ExecutionResult result = graphQL.execute(query);
        System.out.println(result.toSpecification());
    }
}

操作動態數據,數據源可以是數據庫,緩存或者是其他服務,

此例通過動態傳遞id獲取user數據,模擬實現動態數據

import clc.bean.User;
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.Scalars;
import graphql.schema.GraphQLArgument;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;

/**
 * ClassName: GraphQLDemo<br/>
 * Description: <br/>
 * date: 2019/6/28 10:40 AM<br/>
 *
 * @author chengluchao
 * @since JDK 1.8
 */

public class GraphQLDemo2 {
    public static void main(String[] args) {
        //定義對象
        GraphQLObjectType userObjectType = GraphQLObjectType.newObject()
                .name("User")
                .field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString))
                .build();
        //user : User 指定對象及參數類型
        GraphQLFieldDefinition userFileldDefinition = GraphQLFieldDefinition.newFieldDefinition()
                .name("user")
                .type(userObjectType)
                .argument(GraphQLArgument.newArgument().name("id").type(Scalars.GraphQLLong).build())
                //動態數據
                .dataFetcher(environment -> {
                    Long id = environment.getArgument("id");
                    //查庫或者調用其他服務
                    return new User(20, id, "模擬用戶1");
                })
                .build();
        //type UserQuery 定義查詢類型
        GraphQLObjectType userQueryObjectType = GraphQLObjectType.newObject()
                .name("UserQuery")
                .field(userFileldDefinition)
                .build();
        //Schema 定義查詢
        GraphQLSchema qlSchema = GraphQLSchema.newSchema().query(userQueryObjectType).build();

        GraphQL graphQL = GraphQL.newGraphQL(qlSchema).build();
        String query = "{user(id:15){id,name,age}}";
        ExecutionResult result = graphQL.execute(query);
        System.out.println(result.toSpecification());
    }
}

以上兩個例子都是通過GraphQLObjectType的field等方法來定義模型,除此之外還可以通過SDL文件來生成模型

在resource目錄下創建user.graphqls文件

#對應的User定義如下
schema {    #定義查詢
    query: UserQuery
}
type UserQuery {    #定義查詢類型
    user(id:Long) : User    #指定對象以及參數類型
}
type User { #定義對象
    id: Long!   #!表示非空
    name:String
    age:Int
}

然后程序讀取此文件即可解析成模型;

在此之前需要添加一個依賴包用於讀取文件

     <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

詳情如下:

  

import clc.bean.User;
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.RuntimeWiring;
import graphql.schema.idl.SchemaGenerator;
import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;
import org.apache.commons.io.IOUtils;


/**
 * ClassName: GraphQLSDLDemo<br/>
 * Description: <br/>
 * date: 2019/6/28 11:19 AM<br/>
 *
 * @author chengluchao
 * @since JDK 1.8
 */

public class GraphQLSDLDemo {
    public static void main(String[] args) throws Exception {
        //讀取graphqls文件
        String fileName = "user.graphqls";
        String fileContent = IOUtils.toString(GraphQLSDLDemo.class.getClassLoader().getResource(fileName), "UTF-8");
        //解析文件
        TypeDefinitionRegistry typeDefinitionRegistry = new SchemaParser().parse(fileContent);

        RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
                .type("UserQuery", builder ->
                        builder.dataFetcher("user", environment -> {
                            Long id = environment.getArgument("id");
                            return new User(18, id, "user0" + id);
                        })
                )
                .build();

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

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

        String query = "{user(id:15){id,name,age}}";
        ExecutionResult result = graphQL.execute(query);

        System.out.println("query: " + query);
        System.out.println(result.toSpecification());
    }
}

官方推薦第二種方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM