Java 通過(guò)API操作GraphQL
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)文章
IntelliJ?IDEA?2022.2?正式發(fā)布新功能體驗(yàn)
IntelliJ?IDEA?2022.2為遠(yuǎn)程開(kāi)發(fā)功能帶來(lái)了多項(xiàng)質(zhì)量改進(jìn),使其更美觀、更穩(wěn)定,新版本還具有多項(xiàng)值得注意的升級(jí)和改進(jìn),下面跟隨小編一起看看IDEA?2022.2新版本吧2022-08-08
Java并發(fā)編程線(xiàn)程間通訊實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Java并發(fā)編程線(xiàn)程間通訊實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
springboot中實(shí)現(xiàn)上傳文件的功能簡(jiǎn)單示例
這篇文章主要給大家介紹了關(guān)于springboot中實(shí)現(xiàn)上傳文件功能的相關(guān)資料,在Spring Boot中實(shí)現(xiàn)文件上傳下載功能相對(duì)簡(jiǎn)單,文中給出了代碼示例,需要的朋友可以參考下2023-09-09
Spring基于常用AspectJ切點(diǎn)表達(dá)式使用介紹
AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架,使用AspectJ需要導(dǎo)入Spring?AOP和AspectJ相關(guān)jar包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Java多線(xiàn)程之volatile關(guān)鍵字及內(nèi)存屏障實(shí)例解析
volatile是JVM提供的一種最輕量級(jí)的同步機(jī)制,因?yàn)镴ava內(nèi)存模型為volatile定義特殊的訪問(wèn)規(guī)則,使其可以實(shí)現(xiàn)Java內(nèi)存模型中的兩大特性:可見(jiàn)性和有序性。這篇文章主要介紹了Java多線(xiàn)程之volatile關(guān)鍵字及內(nèi)存屏障,需要的朋友可以參考下2019-05-05
springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問(wèn)題
這篇文章主要介紹了springboot項(xiàng)目中mybatis-plus@Mapper注入失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

