當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

Spring Boot + GraphQL 才是 API 的未來(lái)!
2021-10-27 14:36:05

點(diǎn)擊“終碼一生”,關(guān)注,置頂公眾號(hào)

每日技術(shù)干貨,第一時(shí)間送達(dá)!



1

前言


在淺嘗GraphQL一文描述了GraphQL及基本使用,本文提供一個(gè)基本示例,描述如何基于spring boot的web項(xiàng)目快速應(yīng)用。


graphql-java的官方文檔:Getting started with GraphQL Java and Spring Boot,提供了相關(guān)依賴(lài)用以快速配置,但是個(gè)人真心不建議使用這個(gè)庫(kù)及相關(guān)配置方式來(lái)搭建腳手架,在實(shí)際開(kāi)發(fā)中,業(yè)務(wù)比較復(fù)雜的時(shí)候,會(huì)導(dǎo)致需要配置的業(yè)務(wù)代碼比較多也比較繁瑣,相對(duì)下面這種方式,代碼復(fù)雜性比較高。


本文提供一種更靈活快捷的方式,在spring boot項(xiàng)目中快速應(yīng)用開(kāi)發(fā)。使用的依賴(lài)也和上面官方提供的都不一樣,請(qǐng)注意區(qū)分。


?

2

快速開(kāi)始


創(chuàng)建spring boot工程


通過(guò)Spring Initializr快速搭建,我選的jdk版本及spring boot版本,如下所示,其它版本未做兼容性測(cè)試。


Spring Boot + GraphQL 才是 API 的未來(lái)!_spring


點(diǎn)擊下方的Generate按鈕:


Spring Boot + GraphQL 才是 API 的未來(lái)!_web項(xiàng)目_02


打開(kāi)工程結(jié)構(gòu)如下,我將application.properties刪除了替換成applicaiton.yml,因?yàn)槲覀€(gè)人比較喜歡yaml的配置方式:


Spring Boot + GraphQL 才是 API 的未來(lái)!_java_03


初始化GraphQL實(shí)例


我們將創(chuàng)建一個(gè)GraphQL實(shí)例并將其注冊(cè)到spring容器中,代碼如下:


創(chuàng)建一個(gè)GraphQLProvider類(lèi):


@Component
public class GraphQLProvider {
private GraphQL graphQL;
@Autowired
private IItemService itemService;
@Bean
public GraphQL graphQL() {
return graphQL;
}

@PostConstruct
public void init() throws IOException {
GraphQLSchema graphQLSchema = SchemaParser.newParser()
.file("graphql/base.graphqls")
.resolvers(new Query(), new Mutation())
.file("graphql/item.graphqls")
.resolvers(new ItemResolver(itemService))
// .file("book.graphqls")
// .resolvers(new BookResolver()) //其它定義照上面的示例,繼續(xù)增加
.build().makeExecutableSchema();
this.graphQL = graphQL.newGraphQL(graphQLSchema).build();
}
}


關(guān)于*.graphqls或者對(duì)應(yīng)的Resolver如ItemResolver,可以參看淺嘗GraphQL相關(guān)描述,這里只是作了微調(diào)整,相關(guān)代碼如下:


base.grqphqls


schema {
# 查詢(xún)
query: Query
# 更新
mutation: Mutation
}

type Query {
version: String
}

type Mutation {
version: String
}


item.graphqls


# 定義一個(gè)查詢(xún)類(lèi)型
extend type Query {
queryItemList: ItemList # 定義查詢(xún)項(xiàng)目列表
queryById(id: ID): Item
}

extend type Mutation {
updateName(param: Param): Item
}

# 定義項(xiàng)目字段
type Item {
id: ID!
code: String!
name: String!
}

type ItemList {
itemList: [Item!]! #獲取項(xiàng)目列表
total: Int! # 獲取項(xiàng)目總數(shù)
}

input Param {
id: ID!
name: String!
}


ItemResolver


public class ItemResolver implements GraphQLQueryResolver, GraphQLMutationResolver {

private IItemService itemService;

public ItemResolver(IItemService itemService) {
this.itemService = itemService;
}

// 對(duì)應(yīng)item.graphqls里的queryItemList
public ItemList queryItemList() {
return itemService.queryItemList();
}

public Item queryById(Long id) {
return itemService.queryById(id);
}

public Item updateName(Param param) {
return itemService.updateName(param);
}
}


相關(guān)業(yè)務(wù)代碼比較多,就不一一貼了。


提供API


我們需要暴露一個(gè)接口來(lái)接收請(qǐng)求,并作相關(guān)處理,也只需提供一個(gè)接口即可。因此我們創(chuàng)建一個(gè)Controller:GraphqlController.


@RestController
@RequestMapping("/graphql")
@Log
public class GraphqlController {

@Autowired
private GraphQL graphQL;

@PostMapping
public Object execute(@RequestBody GraphqlRequest request) {
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query(request.getQuery())
.variables(request.getVariables())
.build();
Map<String, Object> result = new HashMap<>();

ExecutionResult executionResult = graphQL.execute(executionInput);
List<GraphQLError> errors = executionResult.getErrors();

if (errors != null && !errors.isEmpty()) {
result.put("errors", errors);
return result;
}
return executionResult.getData();
}
}


到這一步,其實(shí)基本功能都已配置完成,可以啟動(dòng)項(xiàng)目進(jìn)行相關(guān)測(cè)試了。


整個(gè)項(xiàng)目的代碼結(jié)構(gòu)如下,我盡量用了一個(gè)比較常規(guī)的web項(xiàng)目結(jié)構(gòu)(controller,service,dao等):


Spring Boot + GraphQL 才是 API 的未來(lái)!_ide_04


測(cè)試


示例中總共提供了3個(gè)接口,兩個(gè)查詢(xún)一個(gè)更新,分別進(jìn)行測(cè)試:


ItemList queryItemList();
Item queryById(Long id);
Item updateName(Param param);


  • 查詢(xún)所有項(xiàng)目列表(只獲取每個(gè)項(xiàng)目的編碼和名稱(chēng),以及列表總數(shù)):


Spring Boot + GraphQL 才是 API 的未來(lái)!_ide_05


  • 根據(jù)ID查詢(xún),獲取項(xiàng)目的id和名稱(chēng)


Spring Boot + GraphQL 才是 API 的未來(lái)!_基本配置_06


  • 更新指定ID的項(xiàng)目名稱(chēng)


我們項(xiàng)目Id為1編碼為test的項(xiàng)目修改為“java項(xiàng)目”


Spring Boot + GraphQL 才是 API 的未來(lái)!_java_07


再查詢(xún)一下,可以看到結(jié)果更新了:


Spring Boot + GraphQL 才是 API 的未來(lái)!_基本配置_08


?

3

結(jié)束語(yǔ)


這樣整個(gè)項(xiàng)目的GraphQL相關(guān)的基本配置已經(jīng)完成,可以進(jìn)行業(yè)務(wù)開(kāi)發(fā)了。


來(lái)源:blog.csdn.net/x763795151/article/details/117604505


PS:防止找不到本篇文章,可以收藏點(diǎn)贊,方便翻閱查找哦。

本文摘自 :https://blog.51cto.com/z

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >