最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 通過API操作GraphQL

 更新時間:2021年05月06日 11:44:15   作者:唐宋XY  
這篇文章主要介紹了Java 通過API操作GraphQL的方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

GraphQL可以通過Java的API來實現(xiàn)數(shù)據(jù)的查詢,通過特定的SDL查詢語句,獲取特定的查詢數(shù)據(jù)。相當(dāng)于后端作為提供數(shù)據(jù)源的"數(shù)據(jù)庫",前端根據(jù)定義的SDL語句查詢需要的數(shù)據(jù),將查詢數(shù)據(jù)的控制權(quán)交給前端,提高后端接口的通用性和靈活性

引入依賴

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

需要配置第三方的maven倉庫才可以下載這個jar包,要不然從中央倉庫無法下載。

官方網(wǎng)站,在快速開始中有需要配置的倉庫www.graphql-java.com

Java中使用GraphQL的API

根據(jù)定義的簡單查詢語法通過Java的API查詢數(shù)據(jù)

無參數(shù)簡單查詢

通過定義的查詢格式,通過GraphQL對象實現(xiàn)查詢,需要先構(gòu)建響應(yīng)的數(shù)據(jù)對象和構(gòu)建響應(yīng)的數(shù)據(jù)

/**
 * 簡單展示 GraphQL的查詢,以及通過JavaAPI響應(yīng)數(shù)據(jù)
 */
public class GraphQLSimpleDemo {


    public static void main(String[] args) {
        // 定義數(shù)據(jù)響應(yīng)對象
        GraphQLObjectType userType = createGraphQLObjectType();
        // 根據(jù)定義的數(shù)據(jù)響應(yīng)對象構(gòu)建響應(yīng)的數(shù)據(jù)
        GraphQLFieldDefinition userDefinition = createGraphQLFieldDefinition(userType);
        // 創(chuàng)建查詢響應(yīng)
        GraphQLSchema graphQLSchema = createGraphQLSchema(userDefinition);
        GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();

        // 查詢語句
        String graph1 = "{User{id, name}}";
        // 查詢多個字段
        String graph2 = "{User{id, name, age}}";

        // 執(zhí)行查詢
        ExecutionResult execute = graphQL.execute(graph1);
        // 獲取結(jié)果
        System.out.println(execute.toSpecification());

        // 執(zhí)行查詢
        ExecutionResult execute2 = graphQL.execute(graph2);
        // 獲取結(jié)果
        System.out.println(execute2.toSpecification());
    }

    // 創(chuàng)建GraphQLSchema
    public static GraphQLSchema createGraphQLSchema(GraphQLFieldDefinition userDefinition) {
        GraphQLObjectType userQuery = GraphQLObjectType.newObject()
                                                               .name("userQuery")
                                                               .field(userDefinition)
                                                               .build();
        return GraphQLSchema.newSchema().query(userQuery).build();
    }

    /**
     * 創(chuàng)建GraphQLFieldDefinition對象
     *
     * 根據(jù)定義的查詢對象做真正的查詢,返回查詢數(shù)據(jù)
     *
     * 這里使用靜態(tài)對象構(gòu)建數(shù)據(jù),如果是查詢數(shù)據(jù),可以在這里進行做查詢
     *
     */
    public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) {
        return GraphQLFieldDefinition.newFieldDefinition()
                .name("User")
                .type(userType)
                // 靜態(tài)數(shù)據(jù)
                .dataFetcher(new StaticDataFetcher(new User(1L, "測試", 10)))
                .build();
    }

    /**
     * 定義GraphQLObjectType對象
     * 該對象是用來做查詢響應(yīng)對象的名稱和查詢的字段的定義
     */
    public static GraphQLObjectType createGraphQLObjectType() {
        return GraphQLObjectType.newObject()
                .name("User")
                .field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt))
                .build();
    }

}

帶參數(shù)簡單查詢

自定義的查詢規(guī)范中,可以通過定義參數(shù)實現(xiàn)查詢,在API中可以獲取到參數(shù)通過參數(shù)實現(xiàn)自定義查詢,參數(shù)需要按照規(guī)范定義

/**
 * 簡單展示 GraphQL的查詢,以及通過JavaAPI響應(yīng)數(shù)據(jù)
 *
 * 傳遞參數(shù)進行查詢
 */
public class GraphQLSimpleDemoWithArgs {


    public static void main(String[] args) {
        GraphQLObjectType userType = createGraphQLObjectType();
        GraphQLFieldDefinition userDefinition = createGraphQLFieldDefinition(userType);
        GraphQLSchema graphQLSchema = createGraphQLSchema(userDefinition);
        GraphQL graphQL = GraphQL.newGraphQL(graphQLSchema).build();

        String graph3 = "{User(id:1){id, name, age}}";
        ExecutionResult execute3 = graphQL.execute(graph3);
        // 獲取結(jié)果
        System.out.println(execute3.toSpecification());
    }

    // 創(chuàng)建GraphQLSchema
    public static GraphQLSchema createGraphQLSchema(GraphQLFieldDefinition userDefinition) {
        GraphQLObjectType userQuery = GraphQLObjectType.newObject()
                                                               .name("userQuery")
                                                               .field(userDefinition)
                                                               .build();
        return GraphQLSchema.newSchema().query(userQuery).build();
    }

    /**
     * 創(chuàng)建GraphQLFieldDefinition對象
     *
     * 根據(jù)定義的查詢對象做真正的查詢,返回查詢數(shù)據(jù)
     *
     * 這里使用靜態(tài)對象構(gòu)建數(shù)據(jù),如果是查詢數(shù)據(jù),可以在這里進行做查詢
     *
     */
    public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) {
        return GraphQLFieldDefinition.newFieldDefinition()
                .name("User")
                .type(userType)
                // 設(shè)置參數(shù)查詢數(shù)據(jù)
                .argument(GraphQLArgument.newArgument().name("id").type(Scalars.GraphQLLong).build())
                .dataFetcher(environment -> {
                    Long id = environment.getArgument("id");
                    return new User(id, "name" + id, id.intValue());
                })

                .build();
    }

    /**
     * 定義GraphQLObjectType對象
     * 該對象是用來做查詢響應(yīng)對象的名稱和查詢的字段的定義
     */
    public static GraphQLObjectType createGraphQLObjectType() {
        return GraphQLObjectType.newObject()
                .name("User")
                .field(GraphQLFieldDefinition.newFieldDefinition().name("id").type(Scalars.GraphQLLong))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("name").type(Scalars.GraphQLString))
                .field(GraphQLFieldDefinition.newFieldDefinition().name("age").type(Scalars.GraphQLInt))
                .build();
    }
    
}

上面兩個關(guān)于GraphQL的簡單示例,一個是沒有參數(shù)的查詢,一個是通過傳遞參數(shù)的查詢,可以看出來,GraphQL的在查詢數(shù)據(jù)的控制權(quán)交給定義的查詢語句,GraphQL構(gòu)建的數(shù)據(jù)作為基礎(chǔ)的數(shù)據(jù)源,如果使用GraphQL定義的接口具有靈活性和通用性,但是可以看出來,在使用方面也是較為復(fù)雜,并且接口多和較為復(fù)雜的情況下,相對于Restful來講,較為復(fù)雜,兩種方式各有優(yōu)缺點

下一篇,將簡單示例在Springboot中使用GraphQL定義接口~~

以上就是Java 通過API操作GraphQL的詳細(xì)內(nèi)容,更多關(guān)于Java 操作GraphQL的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗

    IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗

    IntelliJ?IDEA?2022.2為遠(yuǎn)程開發(fā)功能帶來了多項質(zhì)量改進,使其更美觀、更穩(wěn)定,新版本還具有多項值得注意的升級和改進,下面跟隨小編一起看看IDEA?2022.2新版本吧
    2022-08-08
  • Spring中事務(wù)傳播行為的介紹

    Spring中事務(wù)傳播行為的介紹

    今天小編就為大家分享一篇關(guān)于Spring中事務(wù)傳播行為的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java并發(fā)編程線程間通訊實現(xiàn)過程詳解

    Java并發(fā)編程線程間通訊實現(xiàn)過程詳解

    這篇文章主要介紹了Java并發(fā)編程線程間通訊實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • springboot中實現(xiàn)上傳文件的功能簡單示例

    springboot中實現(xiàn)上傳文件的功能簡單示例

    這篇文章主要給大家介紹了關(guān)于springboot中實現(xiàn)上傳文件功能的相關(guān)資料,在Spring Boot中實現(xiàn)文件上傳下載功能相對簡單,文中給出了代碼示例,需要的朋友可以參考下
    2023-09-09
  • Java如何防止JS腳本注入代碼實例

    Java如何防止JS腳本注入代碼實例

    這篇文章主要介紹了Java如何防止JS腳本注入代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot 配置 okhttp3的操作

    SpringBoot 配置 okhttp3的操作

    這篇文章主要介紹了SpringBoot 配置 okhttp3的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • JPA之使用JPQL語句進行增刪改查

    JPA之使用JPQL語句進行增刪改查

    這篇文章主要介紹了JPA之使用JPQL語句進行增刪改查,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Spring基于常用AspectJ切點表達式使用介紹

    Spring基于常用AspectJ切點表達式使用介紹

    AspectJ是一個基于Java語言的AOP框架,使用AspectJ需要導(dǎo)入Spring?AOP和AspectJ相關(guān)jar包,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Java多線程之volatile關(guān)鍵字及內(nèi)存屏障實例解析

    Java多線程之volatile關(guān)鍵字及內(nèi)存屏障實例解析

    volatile是JVM提供的一種最輕量級的同步機制,因為Java內(nèi)存模型為volatile定義特殊的訪問規(guī)則,使其可以實現(xiàn)Java內(nèi)存模型中的兩大特性:可見性和有序性。這篇文章主要介紹了Java多線程之volatile關(guān)鍵字及內(nèi)存屏障,需要的朋友可以參考下
    2019-05-05
  • springboot項目中mybatis-plus@Mapper注入失敗問題

    springboot項目中mybatis-plus@Mapper注入失敗問題

    這篇文章主要介紹了springboot項目中mybatis-plus@Mapper注入失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

治多县| 社会| 万年县| 陕西省| 丹巴县| 屏东县| 通城县| 新竹县| 辛集市| 西吉县| 临沂市| 定结县| 安徽省| 双江| 玉环县| 石棉县| 宝山区| 揭东县| 青海省| 鸡西市| 景宁| 定陶县| 科尔| 耒阳市| 开阳县| 任丘市| 沙湾县| 竹溪县| 夹江县| 丰宁| 石城县| 尼勒克县| 黔西| 荥阳市| 申扎县| 潮安县| 宜兰市| 长垣县| 于都县| 茌平县| 敦化市|