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 攔截(WebInput webInput, WebGraphQlHandler next) {
webInput.configureExecutionInput((executionInput, builder) -> {
Map map = ... ;,>
返回 builder.extensions(map).build();
});
返回 next.handle(webInput);
}
}
使用WebInterceptor
也攔截響應,增加HTTP響應頭,或轉換graphql.ExecutionResult
:
類 MyInterceptor 實現了 WebInterceptor {
@覆蓋
public Mono 攔截(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 處理程序相同的線程上執行,例如如果異步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 values) {,>
if (values.containsKey(KEY)) {
RequestContextHolder.setRequestAttributes((RequestAttributes) values.get(KEY));
}
}
@覆蓋
public void resetValues(Map 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
。
未完待續……
-
JAVA
+關注
關注
19文章
2976瀏覽量
105211 -
spring
+關注
關注
0文章
340瀏覽量
14398 -
GraphQL
+關注
關注
0文章
14瀏覽量
581
發布評論請先 登錄
相關推薦
校園點餐訂餐外賣跑腿Java源碼
![校園點餐訂餐外賣跑腿Java源碼](https://file1.elecfans.com/web2/M00/01/88/wKgZoma12kuAW8bCAAC3AW_syTQ129.png)
SSM框架的源碼解析與理解
SSM框架的性能優化技巧 SSM框架中RESTful API的實現
SSM框架的優缺點分析 SSM在移動端開發中的應用
SSM開發環境的搭建教程 SSM與Spring Boot的區別
SSM框架在Java開發中的應用 如何使用SSM進行web開發
Spring 應用合并之路(二):峰回路轉,柳暗花明
JavaWeb框架比較
Spring事務實現原理
![<b class='flag-5'>Spring</b>事務實現原理](https://file1.elecfans.com//web2/M00/0B/1B/wKgZomctcxKAXsmhAAEMko_SUCM423.png)
Spring Cloud Gateway網關框架
![<b class='flag-5'>Spring</b> Cloud Gateway網關框架](https://file1.elecfans.com/web2/M00/04/A6/wKgaombGkiKAAwa1AAE-bJwRAe8680.png)
vue+spring boot人員定位系統源碼,實現實時定位、智慧調度、軌跡追蹤
![vue+<b class='flag-5'>spring</b> boot人員定位系統源碼,實現實時定位、智慧調度、軌跡追蹤](https://file1.elecfans.com/web2/M00/01/43/wKgZoma0ZG2AdMnzAA7KFcPQfdw999.png)
玩轉Spring狀態機
![玩轉<b class='flag-5'>Spring</b>狀態機](https://file1.elecfans.com//web2/M00/F3/2C/wKgaomZ46Y6AHiVCAACxvB4H4AM171.png)
評論