Blogger Information
Blog 29
fans 0
comment 0
visits 17877
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Spring认证_什么是Spring GraphQL?
IT胶囊
Original
634 people have browsed it

数据整合

查询dsl

Spring GraphQL 支持使用Querydsl通过 Spring Data Querydsl 扩展来获取数据。Querydsl 提供了一种灵活但类型安全的方法,通过使用注释处理器生成元模型来表达谓词。

例如,将存储库声明为QuerydslPredicateExecutor:

公共接口 AccountRepository 扩展了 Repository<Account, Long>,

           QuerydslPredicateExecutor<Account> {

}

然后用它来创建一个DataFetcher:

// 对于单结果查询

DataFetcher<Account> dataFetcher =

       QuerydslDataFetcher.builder(repository).single();

// 对于多结果查询

DataFetcher<Iterable<Account>> dataFetcher =

       QuerydslDataFetcher.builder(repository).many();

所述DataFetcher构建一个QuerydslPredicate从GraphQL请求参数,并使用它来获取数据。Spring Data支持QuerydslPredicateExecutorJPA、MongoDB和LDAP。

如果存储库是ReactiveQuerydslPredicateExecutor,则构建器返回DataFetcher<Mono<Account>>或DataFetcher<Flux<Account>>。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 你的 Spring 配置:

ApplicationContext 上下文 = ... ;

WebTestClient 客户端 =

       WebTestClient.bindToApplicationContext(上下文)

               .configureClient()

               .baseUrl("/graphql")

               。建造();

WebGraphQlTester 测试器 = WebGraphQlTester.builder(client).build();

对于没有服务器的Spring MVC,请使用MockMvcWebTestClient构建器:

WebApplicationContext 上下文 = ... ;

WebTestClient 客户端 =

       MockMvcWebTestClient.bindToApplicationContext(context)

               .configureClient()

               .baseUrl("/graphql")

               。建造();

WebGraphQlTester 测试器 = WebGraphQlTester.builder(client).build();

对于实时运行的服务器的测试:

WebTestClient 客户端 =

       WebTestClient.bindToServer()

               .baseUrl("http://localhost:8080/graphql")

               。建造();

WebGraphQlTester 测试器 = WebGraphQlTester.builder(client).build();

查询

下面是使用JsonPath提取GraphQL响应中的所有发布版本的示例查询测试。

字符串查询 = "{" +

       " 项目(slug:\"spring-framework\") {" +

       " 发布 {" +

       "版本" +

       " }"+

       " }" +

       "}";

graphQlTester.query(查询)

       。执行()

       .path("project.releases[*].version")

       .entityList(String.class)

       .hasSizeGreaterThan(1);

JsonPath相对于响应的“数据”部分。

错误

测试不能使用数据,如果在响应中出现错误的“错误”键下有错误。 如果需要忽略错误,请使用错误过滤器Predicate:

graphQlTester.query(查询)

       。执行()

       .错误()

       .filter(错误 -> ...)

       。核实()

       .path("project.releases[*].version")

       .entityList(String.class)

       .hasSizeGreaterThan(1);

错误过滤器可以注册并渗入所有测试:

WebGraphQlTester graphQlTester = WebGraphQlTester.builder(client)

       .errorFilter(error -> ...)

       。建造();

或者直接检查所有错误,将它们标记为已过滤:

graphQlTester.query(查询)

       。执行()

       .错误()

       .satisfy(错误 -> {

           // ...

       });

如果请求没有任何响应数据(例如状态),则使用executeAndVerify代替execute来验证响应中没有错误:

graphQlTester.query(query).executeAndVerify();

订阅

该executeSubscription方法定义了特定于该订阅的工作流,工作流返回响应流而不是单个响应。

要测试订阅,您可以GraphQlTester创建创建GraphQlService,graphql.GraphQL直接调用并返回响应流:

GraphQlService 服务 = ... ;

GraphQlTester graphQlTester = GraphQlTester.builder(service).build();

Flux<String> result = graphQlTester.query("订阅{问候}")

   .executeSubscription()

   .toFlux("问候", String.class); // 解码每个响应

该StepVerifier验证流从工程反应堆成堆的:

Flux<String> result = graphQlTester.query("订阅{问候}")

   .executeSubscription()

   .toFlux("问候", String.class);

StepVerifier.create(result)

       .expectNext("嗨")

       .expectNext("卓悦")

       .expectNext("你好")

       .verifyComplete();

要使用Web拦截链进行测试,您可以创建WebGraphQlTester一个WebGraphQlHandler:

GraphQlService 服务 = ... ;

WebGraphQlHandler 处理程序 = WebGraphQlHandler.builder(service)

   .interceptor((input, next) -> next.handle(input))

   。建造();

WebGraphQlTester graphQlTester = WebGraphQlTester.builder(handler).build();

目前,Spring GraphQL 不支持使用 WebSocket 客户端进行测试,也不能用于 GraphQL 对 WebSocket 请求的集成测试。

未完待续……



Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post