Spring GraphQL 為構(gòu)建在 GraphQL Java 上的 Spring 應(yīng)用程序提供支持。兩個(gè)團(tuán)隊(duì)之間的聯(lián)合聯(lián)合。我們的共同理念是少固執(zhí)己見(jiàn),更專(zhuān)注于全面和廣泛的支持。
Spring GraphQL 是 GraphQL Java 團(tuán)隊(duì)的 GraphQL Java Spring 項(xiàng)目的繼承者。它將成為所有 Spring、GraphQL 應(yīng)用程序的基礎(chǔ)。
網(wǎng)絡(luò)傳輸
Spring GraphQL 支持通過(guò) HTTP 和 WebSocket 的 GraphQL 請(qǐng)求。
HTTP
GraphQlHttpHandler通過(guò) HTTP 請(qǐng)求處理 GraphQL,并委托給 Web 攔截執(zhí)行請(qǐng)求。有兩種變體,一種用于 Spring MVC,一種用于 Spring WebFlux。分別依賴(lài)周期性和非周期性 I/O 來(lái)寫(xiě) HTTP 響應(yīng)。
請(qǐng)求必須使用 HTTP POST 和 GraphQL 請(qǐng)求詳細(xì)信息作為 JSON 包含在請(qǐng)求正文中,如提議的 GraphQL over HTTP 規(guī)范中定義。成功解碼 JSON 正文后,HTTP 響應(yīng)狀態(tài)始終為 200(OK),并且 GraphQL 請(qǐng)求執(zhí)行中任何錯(cuò)誤都出現(xiàn)在 GraphQL 響應(yīng)的“錯(cuò)誤”部分。
GraphQlHttpHandler可以通過(guò)聲明一個(gè)RouterFunctionbean 并使用RouterFunctions來(lái)自 Spring MVC 或 WebFlux 的來(lái)創(chuàng)建路由來(lái)作為 HTTP 公開(kāi)公開(kāi)。啟動(dòng)啟動(dòng)器執(zhí)行此操作。
Spring GraphQL 存儲(chǔ)庫(kù)包含一個(gè) Spring MVC HTTP 示例應(yīng)用程序。
網(wǎng)絡(luò)結(jié)果
GraphQlWebSocketHandler基于graphql的協(xié)議通過(guò)WebSocket請(qǐng)求處理Graphws庫(kù)。在WebSocket上使用GraphQL的結(jié)果是訂閱,它允許發(fā)送GraphQL響應(yīng)流,但它也可以用于有一次響應(yīng)的經(jīng)常查詢(xún)處理程序。個(gè)請(qǐng)求委托給Web攔截鏈以進(jìn)一步執(zhí)行請(qǐng)求。
有兩種變體GraphQlWebSocketHandler,用于一種Spring MVC,用于Spring WebFlux。 回流處理請(qǐng)求并具有強(qiáng)大的壓處理功能。消息,這很有效,因?yàn)樵?GraphQL Java 中訂閱響應(yīng)是 Reactive Streams Publisher。
該graphql-ws項(xiàng)目已經(jīng)全部供客戶(hù)使用的配方。
GraphQlWebSocketHandler通過(guò)聲明SimpleUrlHandlerMappingbean 并可以使用通信處理程序映射到 URL 路徑來(lái)公開(kāi)為 WebSocket 需求。啟動(dòng)啟動(dòng)器具有啟用此功能的選項(xiàng),詳細(xì)信息或檢查或例如配置,請(qǐng)參閱 Web 頁(yè)面。GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfiguration
Spring GraphQL 存儲(chǔ)庫(kù)包含一個(gè) WebFlux WebSocket 示例應(yīng)用程序。
網(wǎng)頁(yè)攔截
HTTP和WebSocket的傳輸處理程序委托給一個(gè)通用的網(wǎng)絡(luò)攔截鏈來(lái)執(zhí)行請(qǐng)求。鏈該由一系列WebInterceptor組件組成,一個(gè)后跟GraphQlService調(diào)用GraphQL的Java引擎的。
WebInterceptor在 Spring MVC 和 WebFlux 應(yīng)用程序中使用的通用組件。使用它來(lái)攔截請(qǐng)求、檢查 HTTP 請(qǐng)求標(biāo)頭或注冊(cè)以下內(nèi)容的轉(zhuǎn)換graphql.ExecutionInput:
類(lèi) MyInterceptor 實(shí)現(xiàn)了 WebInterceptor {
@覆蓋
public Mono 攔截(WebInput webInput, WebGraphQlHandler next) {
webInput.configureExecutionInput((executionInput, builder) -> {
Map map = ... ;,>
返回 builder.extensions(map).build();
});
返回 next.handle(webInput);
}
}
使用WebInterceptor也攔截響應(yīng),增加HTTP響應(yīng)頭,或轉(zhuǎn)換graphql.ExecutionResult:
類(lèi) MyInterceptor 實(shí)現(xiàn)了 WebInterceptor {
@覆蓋
public Mono 攔截(WebInput webInput, WebGraphQlHandler next) {
返回 next.handle(webInput)
.map(webOutput -> {
對(duì)象數(shù)據(jù) = webOutput.getData();
對(duì)象更新數(shù)據(jù) = ... ;
返回 webOutput.transform(builder -> builder.data(updatedData));
});
}
}
WebGraphQlHandler提供了一個(gè)builder來(lái)初始化Web攔截鏈。構(gòu)建鏈后,您可以使用結(jié)果WebGraphQlHandler來(lái)初始化HTTP或WebSocket傳輸處理程序。啟動(dòng)器配置了所有這些,有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)Web Endpoints,或檢查GraphQlWebMvcAutoConfiguration或GraphQlWebFluxAutoConfiguration配置。
查詢(xún)執(zhí)行
GraphQlService是調(diào)用GraphQL Java 來(lái)執(zhí)行請(qǐng)求的主要Spring GraphQL 抽象。通過(guò)傳輸,例如Web 傳輸,委托GraphQlService來(lái)處理請(qǐng)求。
主要實(shí)現(xiàn)ExecutionGraphQlService是圍繞著調(diào)用的薄外觀graphql.GraphQL。它配置了一個(gè)GraphQlSource用于訪問(wèn)graphql.GraphQL實(shí)例。
GraphQLSource
GraphQlSource是核心 Spring GraphQL 抽象,用于訪問(wèn)graphql.GraphQL請(qǐng)求執(zhí)行的實(shí)例。它提供了一個(gè)構(gòu)建器 API 來(lái)初始化 GraphQL Java 并構(gòu)建一個(gè)GraphQlSource。
GraphQlSource可通過(guò)訪問(wèn)的默認(rèn)構(gòu)建器GraphQlSource.builder()支持Reactive DataFetcher、Context Propagation和Exception Resolution。
反應(yīng)式 DataFetcher
默認(rèn)GraphQlSource構(gòu)建器啟用對(duì)一個(gè)DataFetcher報(bào)道查看Mono或的請(qǐng)立即獲取iTunes Flux。報(bào)道查看無(wú)論類(lèi)型適合在一個(gè)CompletableFuture與Flux聚集,變成了一個(gè)列表值,除非請(qǐng)求是GraphQL訂閱請(qǐng)求,這種在情況下報(bào)道查看值保持在無(wú)流Publisher的流GraphQL響應(yīng)。
反應(yīng)式DataFetcher可以依賴(lài)對(duì)從傳輸層傳播的 Reactor 上下文的訪問(wèn),例如來(lái)自 WebFlux 請(qǐng)求處理,請(qǐng)參閱 WebFlux 上下文。
大約傳播
Spring GraphQL 支持從Web 傳輸、通過(guò)GraphQL 引擎以及DataFetcher它調(diào)用的其他組件透明地傳播上下文。這包括ThreadLocal來(lái)自SpringMVC 請(qǐng)求處理線程的上下文和Context來(lái)自WebFlux 處理管道的Reactor。
網(wǎng)管
DataFetcherGraphQL Java 調(diào)用的 A 和其他組件可能并不總是在與 Spring MVC 處理程序相同的線程上執(zhí)行,例如如果異步WebInterceptor或DataFetcher切換到不同的線程。
Spring GraphQL 支持將ThreadLocal值從容器線程傳播到線程DataFetcher以及由 GraphQL 引擎調(diào)用的其他組件執(zhí)行。因此,應(yīng)用程序需要?jiǎng)?chuàng)建一個(gè)ThreadLocalAccessor來(lái)ThreadLocal提取生物的值:
公共類(lèi) RequestAttributesAccessor 實(shí)現(xiàn) ThreadLocalAccessor {
private static final String KEY = RequestAttributesAccessor.class.getName();
@覆蓋
公共無(wú)效提取值(地圖<字符串,對(duì)象>容器){
container.put(KEY, RequestContextHolder.getRequestAttributes());
}
@覆蓋
public void restoreValues(Map values) {,>
if (values.containsKey(KEY)) {
RequestContextHolder.setRequestAttributes((RequestAttributes) values.get(KEY));
}
}
@覆蓋
public void resetValues(Map values) {,>
RequestContextHolder.resetRequestAttributes();
}
}
一個(gè)ThreadLocalAccessor可以在 WebGraphHandler 構(gòu)建器中注冊(cè)。Boot starter 檢測(cè)這種類(lèi)型的 bean 并自動(dòng)為 Spring MVC 應(yīng)用程序注冊(cè)它們,請(qǐng)參見(jiàn) Web Endpoints。
網(wǎng)絡(luò)流量
一個(gè)反應(yīng)DataFetcher可以從獲取反應(yīng)背景下,WebFlux 口頭請(qǐng)求處理鏈。這包括由 WebInterceptor 組件添加的 Reactor 上下文。
異常解決
GraphQL Java 應(yīng)用程序可以注冊(cè)一個(gè)DataFetcherExceptionHandler來(lái)決定如何在 GraphQL 響應(yīng)的“錯(cuò)誤”部分中表示來(lái)自數(shù)據(jù)層的異常。
Spring GraphQL 有一個(gè)內(nèi)置的DataFetcherExceptionHandler,配置為供GraphQLSource構(gòu)建器使用。它使應(yīng)用程序注冊(cè)一個(gè)或多個(gè)DataFetcherExceptionResolver順序調(diào)用的 Spring 組件,直到將解析Exception為graphql.GraphQLError對(duì)象列表。
DataFetcherExceptionResolver是一個(gè)異步契約。對(duì)于大多數(shù)實(shí)現(xiàn),這將是悉尼的擴(kuò)展DataFetcherExceptionResolverAdapter和覆蓋其一個(gè)resolveToSingleError或resolveToMultipleErrors方法是解決異常同步。
AGraphQLError可以分配一個(gè)graphql.ErrorClassification。Spring GraphQL 定義了一個(gè)ErrorType常見(jiàn)錯(cuò)誤分類(lèi)類(lèi)別的枚舉:
-
BAD_REQUEST -
UNAUTHORIZED -
FORBIDDEN -
NOT_FOUND -
INTERNAL_ERROR
應(yīng)用程序可以使用它來(lái)分類(lèi)錯(cuò)誤。如果它錯(cuò)誤解決,則默認(rèn)情況下將標(biāo)記為INTERNAL_ERROR。
未完待續(xù)……
-
JAVA
+關(guān)注
關(guān)注
20文章
2995瀏覽量
115404 -
spring
+關(guān)注
關(guān)注
0文章
341瀏覽量
15705 -
GraphQL
+關(guān)注
關(guān)注
0文章
14瀏覽量
763
發(fā)布評(píng)論請(qǐng)先 登錄
Spring攔截器:你的請(qǐng)求休想逃過(guò)我的五指山!
HarmonyOS5云服務(wù)技術(shù)分享--云緩存快速上手指南
銳寶智聯(lián)精彩亮相Japan IT Week Spring 2025
Spring AI接入DeepSeek:快速打造微應(yīng)用
基于javaPoet的緩存key優(yōu)化實(shí)踐
校園點(diǎn)餐訂餐外賣(mài)跑腿Java源碼

Spring認(rèn)證_什么是Spring GraphQL
評(píng)論