Spring認證_什麼是Spring GraphQL

Adobe國際認證發表於2021-08-06

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 可以透過宣告一個 RouterFunction bean 並使用 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 透過宣告 SimpleUrlHandlerMapping bean 並 可以 使用通訊處理程式對映到 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。

網管

DataFetcher GraphQL Java 呼叫的 A 和其他元件可能並不總是在與 Spring MVC 處理程式相同的執行緒上執行,例如如果非同步 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 方法是解決異常同步。

A GraphQLError 可以分配一個 graphql.ErrorClassification Spring GraphQL 定義了一個 ErrorType 常見錯誤分類類別的列舉:

  • BAD_REQUEST
  • UNAUTHORIZED
  • FORBIDDEN
  • NOT_FOUND
  • INTERNAL_ERROR

應用程式可以使用它來分類錯誤。如果它錯誤解決,則預設情況下將標記為 INTERNAL_ERROR

未完待續……


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69981720/viewspace-2785689/,如需轉載,請註明出處,否則將追究法律責任。

相關文章