大數據

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:

類 MyInterceptor 實現了 WebInterceptor {

@覆蓋

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。

未完待續……

Leave a Reply

Your email address will not be published. Required fields are marked *