欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 通過(guò)API操作GraphQL

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

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

引入依賴(lài)

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

需要配置第三方的maven倉(cāng)庫(kù)才可以下載這個(gè)jar包,要不然從中央倉(cāng)庫(kù)無(wú)法下載。

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

Java中使用GraphQL的API

根據(jù)定義的簡(jiǎn)單查詢(xún)語(yǔ)法通過(guò)Java的API查詢(xún)數(shù)據(jù)

無(wú)參數(shù)簡(jiǎn)單查詢(xún)

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

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


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

        // 查詢(xún)語(yǔ)句
        String graph1 = "{User{id, name}}";
        // 查詢(xún)多個(gè)字段
        String graph2 = "{User{id, name, age}}";

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

        // 執(zhí)行查詢(xún)
        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對(duì)象
     *
     * 根據(jù)定義的查詢(xún)對(duì)象做真正的查詢(xún),返回查詢(xún)數(shù)據(jù)
     *
     * 這里使用靜態(tài)對(duì)象構(gòu)建數(shù)據(jù),如果是查詢(xún)數(shù)據(jù),可以在這里進(jìn)行做查詢(xún)
     *
     */
    public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) {
        return GraphQLFieldDefinition.newFieldDefinition()
                .name("User")
                .type(userType)
                // 靜態(tài)數(shù)據(jù)
                .dataFetcher(new StaticDataFetcher(new User(1L, "測(cè)試", 10)))
                .build();
    }

    /**
     * 定義GraphQLObjectType對(duì)象
     * 該對(duì)象是用來(lái)做查詢(xún)響應(yīng)對(duì)象的名稱(chēng)和查詢(xún)的字段的定義
     */
    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ù)簡(jiǎn)單查詢(xún)

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

/**
 * 簡(jiǎn)單展示 GraphQL的查詢(xún),以及通過(guò)JavaAPI響應(yīng)數(shù)據(jù)
 *
 * 傳遞參數(shù)進(jìn)行查詢(xún)
 */
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對(duì)象
     *
     * 根據(jù)定義的查詢(xún)對(duì)象做真正的查詢(xún),返回查詢(xún)數(shù)據(jù)
     *
     * 這里使用靜態(tài)對(duì)象構(gòu)建數(shù)據(jù),如果是查詢(xún)數(shù)據(jù),可以在這里進(jìn)行做查詢(xún)
     *
     */
    public static GraphQLFieldDefinition createGraphQLFieldDefinition(GraphQLObjectType userType) {
        return GraphQLFieldDefinition.newFieldDefinition()
                .name("User")
                .type(userType)
                // 設(shè)置參數(shù)查詢(xún)數(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對(duì)象
     * 該對(duì)象是用來(lái)做查詢(xún)響應(yīng)對(duì)象的名稱(chēng)和查詢(xún)的字段的定義
     */
    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();
    }
    
}

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

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

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

相關(guān)文章

  • 分享幾個(gè)寫(xiě)簡(jiǎn)潔java代碼的小技巧

    分享幾個(gè)寫(xiě)簡(jiǎn)潔java代碼的小技巧

    成為一個(gè)優(yōu)秀的Java程序員,有著良好的代碼編寫(xiě)習(xí)慣是必不可少的,下面這篇文章主要給大家介紹了關(guān)于寫(xiě)java代碼的小技巧,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • java虛擬機(jī)多線程進(jìn)階篇總結(jié)

    java虛擬機(jī)多線程進(jìn)階篇總結(jié)

    在本篇內(nèi)容里小編給大家整理了關(guān)于java虛擬機(jī)多線程進(jìn)階篇的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們跟著參考下。
    2019-06-06
  • springboot如何配置上傳文件的maxRequestSize

    springboot如何配置上傳文件的maxRequestSize

    這篇文章主要介紹了springboot如何配置上傳文件的maxRequestSize,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中websocket消息推送的實(shí)現(xiàn)代碼

    Java中websocket消息推送的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java中websocket消息推送的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • java 出現(xiàn)問(wèn)題javax.servlet.http.HttpServlet was not found解決方法

    java 出現(xiàn)問(wèn)題javax.servlet.http.HttpServlet was not found解決方法

    這篇文章主要介紹了java 出現(xiàn)問(wèn)題javax.servlet.http.HttpServlet was not found解決方法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Java編程基礎(chǔ)測(cè)試題分享

    Java編程基礎(chǔ)測(cè)試題分享

    這篇文章主要介紹了Java編程基礎(chǔ)測(cè)試題分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀

    SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀

    這篇文章主要介紹了SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • SpringBoot 返回Html界面的操作代碼

    SpringBoot 返回Html界面的操作代碼

    這篇文章主要介紹了SpringBoot 返回Html界面的相關(guān)資料,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 使用SpringBoot 配置Oracle和H2雙數(shù)據(jù)源及問(wèn)題

    使用SpringBoot 配置Oracle和H2雙數(shù)據(jù)源及問(wèn)題

    這篇文章主要介紹了使用SpringBoot 配置Oracle和H2雙數(shù)據(jù)源及問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中注解@JsonFormat與@DateTimeFormat的使用

    Java中注解@JsonFormat與@DateTimeFormat的使用

    從數(shù)據(jù)庫(kù)獲取時(shí)間傳到前端進(jìn)行展示的時(shí)候,我們有時(shí)候可能無(wú)法得到一個(gè)滿意的時(shí)間格式的時(shí)間日期,本文主要介紹了Java中注解@JsonFormat與@DateTimeFormat的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08

最新評(píng)論