天天看點

Spring認證_什麼是Spring GraphQL?

什麼是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 請求的內建測試。

未完待續……