前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring认证_什么是Spring GraphQL?

Spring认证_什么是Spring GraphQL?

原创
作者头像
IT胶囊
修改2021-08-09 11:27:37
1.7K0
修改2021-08-09 11:27:37
举报
文章被收录于专栏:IT技能应用

什么是Spring GraphQL前沿学习部分:https://cloud.tencent.com/developer/article/1857280

数据整合

查询dsl

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

例如,将存储库声明为QuerydslPredicateExecutor

public interface AccountRepository extends Repository<Account, Long>,

QuerydslPredicateExecutor<Account> {

}

然后用它来创建一个DataFetcher

// For single result queries

DataFetcher<Account> dataFetcher =

QuerydslDataFetcher.builder(repository).single();

// For multi-result queries

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通过接受 a 来自定义绑定到 a 的请求参数 QuerydslBinderCustomizer。对于请求中的每个可用属性,请求参数默认绑定为“等于”。

QuerydslDataFetcher支持 接口和 DTO 投影 以在返回查询结果以进行进一步的 GraphQL 处理之前转换查询结果。

自动注册

QuerydslDataFetcher公开 aGraphQLTypeVisitor查找返回类型与一个或多个 Querydsl 存储库的域类型匹配的顶级查询,并DataFetcher为每个匹配的查询注册 a 。这包括返回单个值的查询和返回值列表的查询。

存储库必须用@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(...)

.build();

GraphQlService graphQlService = new ExecutionGraphQlService(graphQlSource);

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

WebGraphQlTester

WebGraphQlTester扩展GraphQlTester以添加特定于Web 传输的工作流和配置。您需要以下输入之一来创建它:

  • WebTestClient — 作为 HTTP 客户端执行请求,无论是针对 没有服务器的HTTP处理程序,还是针对实时服务器。
  • WebGraphQlHandler — 通过HTTP和WebSocket处理程序使用的Web 拦截链执行请求,这实际上是在没有 Web 框架的情况下进行测试。使用它的一个原因是订阅。

对于没有服务器的 Spring WebFlux,你可以指向你的 Spring 配置:

ApplicationContext context = ... ;

WebTestClient client =

WebTestClient.bindToApplicationContext(context)

.configureClient()

.baseUrl("/graphql")

.build();

WebGraphQlTester tester = WebGraphQlTester.builder(client).build();

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

WebApplicationContext context = ... ;

WebTestClient client =

MockMvcWebTestClient.bindToApplicationContext(context)

.configureClient()

.baseUrl("/graphql")

.build();

WebGraphQlTester tester = WebGraphQlTester.builder(client).build();

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

WebTestClient client =

WebTestClient.bindToServer()

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

.build();

WebGraphQlTester tester = WebGraphQlTester.builder(client).build();

查询

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

String query = "{" +

" project(slug:\"spring-framework\") {" +

" releases {" +

" version" +

" }"+

" }" +

"}";

graphQlTester.query(query)

.execute()

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

.entityList(String.class)

.hasSizeGreaterThan(1);

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

错误

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

graphQlTester.query(query)

.execute()

.errors()

.filter(error -> ...)

.verify()

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

.entityList(String.class)

.hasSizeGreaterThan(1);

错误过滤器可以全局注册并应用于所有测试:

WebGraphQlTester graphQlTester = WebGraphQlTester.builder(client)

.errorFilter(error -> ...)

.build();

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

graphQlTester.query(query)

.execute()

.errors()

.satisfy(errors -> {

// ...

});

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

graphQlTester.query(query).executeAndVerify();

订阅

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

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

GraphQlService service = ... ;

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

Flux<String> result = graphQlTester.query("subscription { greetings }")

.executeSubscription()

.toFlux("greetings", String.class); // decode each response

StepVerifier验证流从工程反应堆是有用的:

Flux<String> result = graphQlTester.query("subscription { greetings }")

.executeSubscription()

.toFlux("greetings", String.class);

StepVerifier.create(result)

.expectNext("Hi")

.expectNext("Bonjour")

.expectNext("Hola")

.verifyComplete();

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

GraphQlService service = ... ;

WebGraphQlHandler handler = WebGraphQlHandler.builder(service)

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

.build();

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

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

未完待续……

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据整合
    • 查询dsl
      • 定制
      • 自动注册
  • 安全
  • 测试
    • GraphQlTester
      • WebGraphQlTester
        • 查询
          • 错误
            • 订阅
            相关产品与服务
            云数据库 MongoDB
            腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档