天天看點

Spring認證_什麼是Spring GraphQL

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。

未完待續……