Spring GraphQL 為建構在 GraphQL Java 上的 Spring 應用程式提供支援。兩個團隊之間的聯合聯合。我們的共同理念是少固執己見,更專注于全面和廣泛的支援。
Spring GraphQL 是 GraphQL Java 團隊的 GraphQL Java Spring 項目的繼承者。它将成為所有 Spring、GraphQL 應用程式的基礎。
網絡傳輸
Spring GraphQL 支援通過 HTTP 和 WebSocket 的 GraphQL 請求。
HTTP
GraphQlHttpHandler通過 HTTP 請求處理 GraphQL,并委托給 Web 攔截執行請求。有兩種變體,一種用于 Spring MVC,一種用于 Spring WebFlux。分别依賴周期性和非周期性 I/O 來寫 HTTP 響應。
請求必須使用 HTTP POST 和 GraphQL 請求詳細資訊作為 JSON 包含在請求正文中,如提議的 GraphQL over HTTP 規範中定義。成功解碼 JSON 正文後,HTTP 響應狀态始終為 200(OK),并且 GraphQL 請求執行中任何錯誤都出現在 GraphQL 響應的“錯誤”部分。
GraphQlHttpHandler可以通過聲明一個RouterFunctionbean 并使用RouterFunctions來自 Spring MVC 或 WebFlux 的來建立路由來作為 HTTP 公開公開。啟動啟動器執行此操作。
Spring GraphQL 存儲庫包含一個 Spring MVC HTTP 示例應用程式。
網絡結果
GraphQlWebSocketHandler基于graphql的協定通過WebSocket請求處理Graphws庫。在WebSocket上使用GraphQL的結果是訂閱,它允許發送GraphQL響應流,但它也可以用于有一次響應的經常查詢處理程式。個請求委托給Web攔截鍊以進一步執行請求。
有兩種變體GraphQlWebSocketHandler,用于一種Spring MVC,用于Spring WebFlux。 回流處理請求并具有強大的壓處理功能。消息,這很有效,因為在 GraphQL Java 中訂閱響應是 Reactive Streams Publisher。
該graphql-ws項目已經全部供客戶使用的配方。
GraphQlWebSocketHandler通過聲明SimpleUrlHandlerMappingbean 并可以使用通信處理程式映射到 URL 路徑來公開為 WebSocket 需求。啟動啟動器具有啟用此功能的選項,詳細資訊或檢查或例如配置,請參閱 Web 頁面。GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfiguration
Spring GraphQL 存儲庫包含一個 WebFlux WebSocket 示例應用程式。
網頁攔截
HTTP和WebSocket的傳輸處理程式委托給一個通用的網絡攔截鍊來執行請求。鍊該由一系列WebInterceptor元件組成,一個後跟GraphQlService調用GraphQL的Java引擎的。
WebInterceptor在 Spring MVC 和 WebFlux 應用程式中使用的通用元件。使用它來攔截請求、檢查 HTTP 請求标頭或注冊以下内容的轉換graphql.ExecutionInput:
類 MyInterceptor 實作了 WebInterceptor {
@覆寫
public Mono<WebOutput> 攔截(WebInput webInput, WebGraphQlHandler next) {
webInput.configureExecutionInput((executionInput, builder) -> {
Map<String, Object> map = ... ;
傳回 builder.extensions(map).build();
});
傳回 next.handle(webInput);
}
}
使用WebInterceptor也攔截響應,增加HTTP響應頭,或轉換graphql.ExecutionResult:
@覆寫
public Mono<WebOutput> 攔截(WebInput webInput, WebGraphQlHandler next) {
傳回 next.handle(webInput)
.map(webOutput -> {
對象資料 = webOutput.getData();
對象更新資料 = ... ;
傳回 webOutput.transform(builder -> builder.data(updatedData));
});
}
WebGraphQlHandler提供了一個builder來初始化Web攔截鍊。建構鍊後,您可以使用結果WebGraphQlHandler來初始化HTTP或WebSocket傳輸處理程式。啟動器配置了所有這些,有關詳細資訊,請參見Web Endpoints,或檢查GraphQlWebMvcAutoConfiguration或GraphQlWebFluxAutoConfiguration配置。
查詢執行
GraphQlService是調用GraphQL Java 來執行請求的主要Spring GraphQL 抽象。通過傳輸,例如Web 傳輸,委托GraphQlService來處理請求。
主要實作ExecutionGraphQlService是圍繞着調用的薄外觀graphql.GraphQL。它配置了一個GraphQlSource用于通路graphql.GraphQL執行個體。
GraphQLSource
GraphQlSource是核心 Spring GraphQL 抽象,用于通路graphql.GraphQL請求執行的執行個體。它提供了一個建構器 API 來初始化 GraphQL Java 并建構一個GraphQlSource。
GraphQlSource可通過通路的預設建構器GraphQlSource.builder()支援Reactive DataFetcher、Context Propagation和Exception Resolution。
反應式 DataFetcher
預設GraphQlSource建構器啟用對一個DataFetcher報道檢視Mono或的請立即擷取iTunes Flux。報道檢視無論類型适合在一個CompletableFuture與Flux聚集,變成了一個清單值,除非請求是GraphQL訂閱請求,這種在情況下報道檢視值保持在無流Publisher的流GraphQL響應。
反應式DataFetcher可以依賴對從傳輸層傳播的 Reactor 上下文的通路,例如來自 WebFlux 請求處理,請參閱 WebFlux 上下文。
大約傳播
Spring GraphQL 支援從Web 傳輸、通過GraphQL 引擎以及DataFetcher它調用的其他元件透明地傳播上下文。這包括ThreadLocal來自SpringMVC 請求處理線程的上下文和Context來自WebFlux 處理管道的Reactor。
網管
DataFetcherGraphQL Java 調用的 A 和其他元件可能并不總是在與 Spring MVC 處理程式相同的線程上執行,例如如果異步WebInterceptor或DataFetcher切換到不同的線程。
Spring GraphQL 支援将ThreadLocal值從容器線程傳播到線程DataFetcher以及由 GraphQL 引擎調用的其他元件執行。是以,應用程式需要建立一個ThreadLocalAccessor來ThreadLocal提取生物的值:
公共類 RequestAttributesAccessor 實作 ThreadLocalAccessor {
private static final String KEY = RequestAttributesAccessor.class.getName();
@覆寫
公共無效提取值(地圖<字元串,對象>容器){
container.put(KEY, RequestContextHolder.getRequestAttributes());
}
@覆寫
public void restoreValues(Map<String, Object> values) {
if (values.containsKey(KEY)) {
RequestContextHolder.setRequestAttributes((RequestAttributes) values.get(KEY));
}
}
@覆寫
public void resetValues(Map<String, Object> values) {
RequestContextHolder.resetRequestAttributes();
}
一個ThreadLocalAccessor可以在 WebGraphHandler 建構器中注冊。Boot starter 檢測這種類型的 bean 并自動為 Spring MVC 應用程式注冊它們,請參見 Web Endpoints。
網絡流量
一個反應DataFetcher可以從擷取反應背景下,WebFlux 口頭請求處理鍊。這包括由 WebInterceptor 元件添加的 Reactor 上下文。
異常解決
GraphQL Java 應用程式可以注冊一個DataFetcherExceptionHandler來決定如何在 GraphQL 響應的“錯誤”部分中表示來自資料層的異常。
Spring GraphQL 有一個内置的DataFetcherExceptionHandler,配置為供GraphQLSource建構器使用。它使應用程式注冊一個或多個DataFetcherExceptionResolver順序調用的 Spring 元件,直到将解析Exception為graphql.GraphQLError對象清單。
DataFetcherExceptionResolver是一個異步契約。對于大多數實作,這将是悉尼的擴充DataFetcherExceptionResolverAdapter和覆寫其一個resolveToSingleError或resolveToMultipleErrors方法是解決異常同步。
AGraphQLError可以配置設定一個graphql.ErrorClassification。Spring GraphQL 定義了一個ErrorType常見錯誤分類類别的枚舉:
BAD_REQUEST
UNAUTHORIZED
FORBIDDEN
NOT_FOUND
INTERNAL_ERROR
應用程式可以使用它來分類錯誤。如果它錯誤解決,則預設情況下将标記為INTERNAL_ERROR。
未完待續……