什麼是Spring GraphQL前沿學習部分: https://developer.aliyun.com/article/786339?spm=a2c6h.13148508.0.0.45d44f0eqFq7UU
資料整合
查詢dsl
Spring GraphQL 支援使用Querydsl通過 Spring Data Querydsl 擴充來擷取資料。Querydsl 提供了一種靈活但類型安全的方法,通過使用注釋處理器生成元模型來表達謂詞。
例如,将存儲庫聲明為QuerydslPredicateExecutor:
公共接口 AccountRepository 擴充了 Repository<Account, Long>,
QuerydslPredicateExecutor<Account> {
}
然後用它來建立一個DataFetcher:
// 對于單結果查詢
DataFetcher dataFetcher =
QuerydslDataFetcher.builder(repository).single();
// 對于多結果查詢
DataFetcher<Iterable> dataFetcher =
QuerydslDataFetcher.builder(repository).many();
所述DataFetcher建構一個QuerydslPredicate從GraphQL請求參數,并使用它來擷取資料。Spring Data支援QuerydslPredicateExecutorJPA、MongoDB和LDAP。
如果存儲庫是ReactiveQuerydslPredicateExecutor,則建構器傳回DataFetcher<Mono>或DataFetcher<Flux>。Spring Data 為 MongoDB 支援此變體。
Spring GraphQL 存儲庫中的 webmvc-http 示例使用 Querydsl 來擷取artifactRepositories。
定制
Querydsl 允許內建Predicate通過接受一個來自定義綁定到一個的請求QuerydslBinderCustomizer。對于請求中的可用參數,請求參數預設綁定為“等于”。
QuerydslDataFetcher支援接口和DTO投影以在傳回查詢結果以進行進一步的GraphQL處理之前的轉換查詢結果。
自動注冊
QuerydslDataFetcher公開一個GraphQLTypeVisitor查找傳回類型與一個或多個查詢存儲庫的域類型比對的查詢查詢,并DataFetcher為每個比對的查詢注冊一個。這包括傳回值的單個查詢和傳回清單的查詢。
存儲庫必須使用@GraphQlRepository。預設情況下,查詢傳回的 GraphQL 類型名稱必須與存儲庫域類型的簡單名稱比對。如果它們不比對,您可以使用的typeName屬性@GraphQlRepository來設定 GraphQL 類型名稱。
突發事件庫會在Boot starter中自動檢測。
安全
可以使用 HTTP URL 安全保護 Web GraphQL 到這個入口的路徑,以確定能夠通過身份驗證的使用者通路它。但是,同時個别 URL 上不同的本地共享路徑上的 GraphQL 請求。
要應用更細粒度的安全性,Spring Security 中注釋添加到涉及擷取 GraphQL 響應的特定部分的服務方法,例如@PreAuthorize或@Secured。由于上下文傳達使安全性和其他上下文在資料擷取級别可用,是以應該是
Spring GraphQL 存儲庫包含 Spring MVC 和 WebFlux 的示例。
測試
您可以使用 Spring 的測試 GraphQL 請求WebTestClient,非常發送和接收 JSON,但許多 GraphQL 特定細節使這種方法比有的更麻煩。
GraphQlTester
GraphQlTester 定義了一個工作流來測試 GraphQL 請求,具有以下優點:
驗證GraphQL響應為200(OK)。
驗證響應中“錯誤”鍵下沒有出現錯誤。
在響應中的“資料”鍵下解碼。
使用 JsonPath 解碼響應的不同部分。
測試訂閱。
要建立GraphQlTester,您隻需要一個GraphQlService,不需要傳輸:
GraphQlSource graphQlSource = GraphQlSource.builder()
.schemaResources(...)
.runtimeWiring(...)
。建造();
GraphQlService graphQlService = new ExecutionGraphQlService(graphQlSource);
GraphQlTester graphQlTester = GraphQlTester.builder(graphQlService).build();
WebGraphQlTester
WebGraphQlTester擴充GraphQlTester傳輸以添加特定于Web 的工作流和配置。您需要以下輸入一個來建立它:
WebTestClient — HTTP 用戶端執行請求,無論是針對沒有伺服器的 HTTP 處理程式,還是針對實時伺服器。
WebGraphQlHandler ——通過HTTP和WebSocket處理程式使用的Web攔截鍊執行請求,這實際上是在沒有Web架構的情況下進行測試。使用的一個原因是訂閱。
如果沒有 WebFlux,你可以支援你的 Spring 配置:
ApplicationContext 上下文 = ... ;
WebTestClient 用戶端 =
WebTestClient.bindToApplicationContext(上下文)
.configureClient()
.baseUrl("/graphql")
。建造();
WebGraphQlTester 測試器 = WebGraphQlTester.builder(client).build();
對于沒有伺服器的Spring MVC,請使用MockMvcWebTestClient建構器:
WebApplicationContext 上下文 = ... ;
MockMvcWebTestClient.bindToApplicationContext(context)
.configureClient()
.baseUrl("/graphql")
。建造();
對于實時運作的伺服器的測試:
WebTestClient.bindToServer()
.baseUrl("http://localhost:8080/graphql")
。建造();
查詢
下面是使用JsonPath提取GraphQL響應中的所有釋出版本的示例查詢測試。
字元串查詢 = "{" +
" 項目(slug:\"spring-framework\") {" +
" 釋出 {" +
“版本”+
" }"+
" }" +
"}";
graphQlTester.query(查詢)
。執行()
.path("project.releases[*].version")
.entityList(String.class)
.hasSizeGreaterThan(1);
JsonPath相對于響應的“資料”部分。
錯誤
測試不能使用資料,如果在響應中出現錯誤的“錯誤”鍵下有錯誤。 如果需要忽略錯誤,請使用錯誤過濾器Predicate:
。執行()
.錯誤()
.filter(錯誤 -> ...)
。核實()
.path("project.releases[*].version")
.entityList(String.class)
.hasSizeGreaterThan(1);
錯誤過濾器可以注冊并滲入所有測試:
WebGraphQlTester graphQlTester = WebGraphQlTester.builder(client)
.errorFilter(error -> ...)
。建造();
或者直接檢查所有錯誤,将它們标記為已過濾:
。執行()
.錯誤()
.satisfy(錯誤 -> {
// ...
});
如果請求沒有任何響應資料(例如狀态),則使用executeAndVerify代替execute來驗證響應中沒有錯誤:
graphQlTester.query(query).executeAndVerify();
訂閱
該executeSubscription方法定義了特定于該訂閱的工作流,工作流傳回響應流而不是單個響應。
要測試訂閱,您可以GraphQlTester建立建立GraphQlService,graphql.GraphQL直接調用并傳回響應流:
GraphQlService 服務 = ... ;
GraphQlTester graphQlTester = GraphQlTester.builder(service).build();
Flux result = graphQlTester.query("訂閱{問候}")
.executeSubscription()
.toFlux("問候", String.class); // 解碼每個響應
該StepVerifier驗證流從工程反應堆成堆的:
.executeSubscription()
.toFlux("問候", String.class);
StepVerifier.create(result)
.expectNext("嗨")
.expectNext("卓悅")
.expectNext("你好")
.verifyComplete();
要使用Web攔截鍊進行測試,您可以建立WebGraphQlTester一個WebGraphQlHandler:
WebGraphQlHandler 處理程式 = WebGraphQlHandler.builder(service)
.interceptor((input, next) -> next.handle(input))
。建造();
WebGraphQlTester graphQlTester = WebGraphQlTester.builder(handler).build();
目前,Spring GraphQL 不支援使用 WebSocket 用戶端進行測試,也不能用于 GraphQL 對 WebSocket 請求的內建測試。
未完待續……