博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
7242
积分:0
P豆:617

Spring认证_什么是Spring GraphQL?

2021年10月18日 20:53:33阅读数:15博客 / Sky

数据整合

查询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 配置:

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 请求的集成测试。

未完待续……

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • Spring Cloud?Spring Cloud致力于分布式系统、云服务的框架。Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具。
    本文来自java面试题,文中为大家分享了spring相关的面试题,希望可以帮助到大家。
    SpringBoot所有基于Spring开发的项目的起点,其设计目的为了让开发者尽可能快速搭建Spring应用程序,并且让开发者尽可能减少配置文件,简单来说SpringBoot其实不框架,而一个工具
    使用Spring框架的好处?答:1、轻量;2、控制反转;3、面向切面的编程;4、容器;5、MVC框架;6、事务管理;7、异常处理。
    Spring一个开源的轻量级的 Java 开发框架, 具有控制反转(IoC)和面向切面(AOP)两大核心。Java Spring 框架通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
    Spring的工作原理就让一个对象的创建不用new就可以自动的生产,在运行时与xml Spring的配置文件来动态的创建对象和调用对象,而不需要通过代码来关联。
    spring和springmvc的区别:SpringIOC和AOP的容器框架;而SpringMVC基于Spring功能的Web框架,想用SpringMVC必须先依赖Spring;SpringMVC一个
    spring boot】原理:1、依赖管理,【Spring Boot】做了大量starter;2、自动配置,【Spring Boot】基于Spring代码配置提供了很多常用组件和框架的配置类;3、内嵌容器
    spring aop原理:1、AOP 面向切面,一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程OOP;2、AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中
    HTTP协议指定了客户端可能发送给服务器样的消息以及得到样的响应;而HTTPS协议以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份了传输过程的安全性。
    Spring Cloud七大组件:1、Eureka组件,描述了服务如何进行注册,注册到哪里;2、Ribbon组件;3、Feign组件,一个声明web服务客户端;4、Hystrix组件;5、Config组件
    spring注入的三种方式:1、构造器注入;2、setter注入;3、接口注入。构造器注入依赖于构造方法的实现,setter注入通过setter方法注入。
    jfinal框架与spring的区别:1、JFinal基于Java语言的极速web开发框架,其核心设计目标开发迅速、代码量少、易扩展等;2、Spring框架由于软件开发的复杂性而创建的,其用途不仅仅限于服务器端的开发
    spring ioc注入的三种方式:1、Setter方法注入,容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法。2、构造方法注入。
    spring、springmvc、springboot三者之间的区别spring开源容器框架,springmvcweb层的mvc框架,springboot微服务框架。
    Spring Boot】最核心的注解:1、@SpringBootApplication,标识这一个Spring Boot应用;2、@Configuration,用来代替applicationContext.xml
    本篇文章给大家介绍一下Spring AOP的半注解和全注解模式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
    java面试及答案:所谓循环依赖就A依赖B,同时B又依赖A,两者之间的依赖关系形成了一个圆环,一般由于不正确的编码所导致。
    用户名@网站名-例sina.com、tom.com、yahoo.com.cn……(有些小网站的邮箱在填资料时不,所以推荐用网站的邮箱)一般都用来判断.正则表达式?