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

SSM框架的源碼解析與理解
SSM與Hibernate的整合使用
SSM框架的性能優(yōu)化技巧 SSM框架中RESTful API的實(shí)現(xiàn)
SSM框架的優(yōu)缺點(diǎn)分析 SSM在移動端開發(fā)中的應(yīng)用
SSM開發(fā)環(huán)境的搭建教程 SSM與Spring Boot的區(qū)別
SSM框架在Java開發(fā)中的應(yīng)用 如何使用SSM進(jìn)行web開發(fā)
Spring 應(yīng)用合并之路(二):峰回路轉(zhuǎn),柳暗花明
JavaWeb框架比較
Spring事務(wù)實(shí)現(xiàn)原理

SpringBean初始化順序

Spring Cloud Gateway網(wǎng)關(guān)框架

玩轉(zhuǎn)Spring狀態(tài)機(jī)

評論