0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring认证_什么是Spring GraphQL

IT胶囊 来源:「Spring」认证安全架构 作者:「Spring」认证安全 2021-08-06 14:30 次阅读

Spring GraphQL 为构建在 GraphQL Java 上的 Spring 应用程序提供支持。两个团队之间的联合联合。我们的共同理念是少固执己见,更专注于全面和广泛的支持。

Spring GraphQL 是 GraphQL Java 团队的 GraphQL Java Spring 项目的继承者。它将成为所有 Spring、GraphQL 应用程序的基础。

网络传输

Spring GraphQL 支持通过 HTTP 和 WebSocket 的 GraphQL 请求。

HTTP

GraphQlHttpHandler通过 HTTP 请求处理 GraphQL,并委托给 Web 拦截执行请求。有两种变体,一种用于 Spring MVC,一种用于 Spring WebFlux。分别依赖周期性和非周期性 I/O 来写 HTTP 响应。

请求必须使用 HTTP POST 和 GraphQL 请求详细信息作为 JSON 包含在请求正文中,如提议的 GraphQL over HTTP 规范中定义。成功解码 JSON 正文后,HTTP 响应状态始终为 200(OK),并且 GraphQL 请求执行中任何错误都出现在 GraphQL 响应的“错误”部分。

GraphQlHttpHandler可以通过声明一个RouterFunctionbean 并使用RouterFunctions来自 Spring MVC 或 WebFlux 的来创建路由来作为 HTTP 公开公开。启动启动器执行此操作。

Spring GraphQL 存储库包含一个 Spring MVC HTTP 示例应用程序。

网络结果

GraphQlWebSocketHandler基于graphql的协议通过WebSocket请求处理Graphws库。在WebSocket上使用GraphQL的结果是订阅,它允许发送GraphQL响应流,但它也可以用于有一次响应的经常查询处理程序。个请求委托给Web拦截链以进一步执行请求。

有两种变体GraphQlWebSocketHandler,用于一种Spring MVC,用于Spring WebFlux。 回流处理请求并具有强大的压处理功能。消息,这很有效,因为在 GraphQL Java 中订阅响应是 Reactive Streams Publisher

graphql-ws项目已经全部供客户使用的配方。

GraphQlWebSocketHandler通过声明SimpleUrlHandlerMappingbean 并可以使用通信处理程序映射到 URL 路径来公开为 WebSocket 需求。启动启动器具有启用此功能的选项,详细信息或检查或例如配置,请参阅 Web 页面。GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfiguration

Spring GraphQL 存储库包含一个 WebFlux WebSocket 示例应用程序。

网页拦截

HTTP和WebSocket的传输处理程序委托给一个通用的网络拦截链来执行请求。链该由一系列WebInterceptor组件组成,一个后跟GraphQlService调用GraphQL的Java引擎的。

WebInterceptor在 Spring MVC 和 WebFlux 应用程序中使用的通用组件。使用它来拦截请求、检查 HTTP 请求标头或注册以下内容的转换graphql.ExecutionInput

类 MyInterceptor 实现了 WebInterceptor {

@覆盖

public Mono 拦截(WebInput webInput, WebGraphQlHandler next) {

webInput.configureExecutionInput((executionInput, builder) -> {

Map map = ... ;,>

返回 builder.extensions(map).build();

});

返回 next.handle(webInput);

}

}

使用WebInterceptor也拦截响应,增加HTTP响应头,或转换graphql.ExecutionResult

类 MyInterceptor 实现了 WebInterceptor {

@覆盖

public Mono 拦截(WebInput webInput, WebGraphQlHandler next) {

返回 next.handle(webInput)

.map(webOutput -> {

对象数据 = webOutput.getData();

对象更新数据 = ... ;

返回 webOutput.transform(builder -> builder.data(updatedData));

});

}

}

WebGraphQlHandler提供了一个builder来初始化Web拦截链。构建链后,您可以使用结果WebGraphQlHandler来初始化HTTP或WebSocket传输处理程序。启动器配置了所有这些,有关详细信息,请参见Web Endpoints,或检查GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfiguration配置。

查询执行

GraphQlService是调用GraphQL Java 来执行请求的主要Spring GraphQL 抽象。通过传输,例如Web 传输,委托GraphQlService来处理请求。

主要实现ExecutionGraphQlService是围绕着调用的薄外观graphql.GraphQL。它配置了一个GraphQlSource用于访问graphql.GraphQL实例。

GraphQLSource

GraphQlSource是核心 Spring GraphQL 抽象,用于访问graphql.GraphQL请求执行的实例。它提供了一个构建器 API 来初始化 GraphQL Java 并构建一个GraphQlSource

GraphQlSource可通过访问的默认构建器GraphQlSource.builder()支持Reactive DataFetcher、Context Propagation和Exception Resolution。

反应式 DataFetcher

默认GraphQlSource构建器启用对一个DataFetcher报道查看Mono或的请立即获取iTunes Flux。报道查看无论类型适合在一个CompletableFutureFlux聚集,变成了一个列表值,除非请求是GraphQL订阅请求,这种在情况下报道查看值保持在无流Publisher的流GraphQL响应。

反应式DataFetcher可以依赖对从传输层传播的 Reactor 上下文的访问,例如来自 WebFlux 请求处理,请参阅 WebFlux 上下文。

大约传播

Spring GraphQL 支持从Web 传输、通过GraphQL 引擎以及DataFetcher它调用的其他组件透明地传播上下文。这包括ThreadLocal来自SpringMVC 请求处理线程的上下文和Context来自WebFlux 处理管道的Reactor。

网管

DataFetcherGraphQL Java 调用的 A 和其他组件可能并不总是在与 Spring MVC 处理程序相同的线程上执行,例如如果异步WebInterceptorDataFetcher切换到不同的线程。

Spring GraphQL 支持将ThreadLocal值从容器线程传播到线程DataFetcher以及由 GraphQL 引擎调用的其他组件执行。因此,应用程序需要创建一个ThreadLocalAccessorThreadLocal提取生物的值:

公共类 RequestAttributesAccessor 实现 ThreadLocalAccessor {

private static final String KEY = RequestAttributesAccessor.class.getName();

@覆盖

公共无效提取值(地图<字符串,对象>容器){

container.put(KEY, RequestContextHolder.getRequestAttributes());

}

@覆盖

public void restoreValues(Map values) {,>

if (values.containsKey(KEY)) {

RequestContextHolder.setRequestAttributes((RequestAttributes) values.get(KEY));

}

}

@覆盖

public void resetValues(Map values) {,>

RequestContextHolder.resetRequestAttributes();

}

}

一个ThreadLocalAccessor可以在 WebGraphHandler 构建器中注册。Boot starter 检测这种类型的 bean 并自动为 Spring MVC 应用程序注册它们,请参见 Web Endpoints。

网络流量

一个反应DataFetcher可以从获取反应背景下,WebFlux 口头请求处理链。这包括由 WebInterceptor 组件添加的 Reactor 上下文。

异常解决

GraphQL Java 应用程序可以注册一个DataFetcherExceptionHandler来决定如何在 GraphQL 响应的“错误”部分中表示来自数据层的异常。

Spring GraphQL 有一个内置的DataFetcherExceptionHandler,配置为供GraphQLSource构建器使用。它使应用程序注册一个或多个DataFetcherExceptionResolver顺序调用的 Spring 组件,直到将解析Exceptiongraphql.GraphQLError对象列表。

DataFetcherExceptionResolver是一个异步契约。对于大多数实现,这将是悉尼的扩展DataFetcherExceptionResolverAdapter和覆盖其一个resolveToSingleErrorresolveToMultipleErrors方法是解决异常同步。

AGraphQLError可以分配一个graphql.ErrorClassificationSpring GraphQL 定义了一个ErrorType常见错误分类类别的枚举:

  • BAD_REQUEST

  • UNAUTHORIZED

  • FORBIDDEN

  • NOT_FOUND

  • INTERNAL_ERROR

应用程序可以使用它来分类错误。如果它错误解决,则默认情况下将标记为INTERNAL_ERROR

未完待续……

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • spring
    +关注

    关注

    0

    文章

    332

    浏览量

    14161
  • GraphQL
    +关注

    关注

    0

    文章

    14

    浏览量

    533
收藏 人收藏

    评论

    相关推荐

    Spring中经典的9种设计模式

    spring中常用的设计模式达到九种,我们一一举例
    的头像 发表于 12-11 09:56 226次阅读
    <b class='flag-5'>Spring</b>中经典的9种设计模式

    Spring MVC的工作原理

    Spring MVC是一种基于Java的Web应用程序框架,它采用了Model-View-Controller(MVC)设计模式来分离应用程序的不同方面。Spring MVC的工作原理涉及多个关键
    的头像 发表于 12-03 11:49 465次阅读

    spring分布式框架有哪些

    Spring分布式框架是一套基于Spring框架的解决方案,用于构建分布式系统。它提供了一系列的组件和模块,可以帮助开发人员轻松地构建可扩展、高可用、高性能的分布式应用程序。下面将详细介绍一些常用
    的头像 发表于 11-16 10:58 358次阅读

    Spring布能用来搭建基础架构吗

    Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它利用 Spring 框架的强大功能,使得基础架构的搭建变得更加简单、轻量级、易于维护。在本文中,我们将详细讨论
    的头像 发表于 11-16 10:56 211次阅读

    Spring Boot 的设计目标

    什么是Spring Boot Spring Boot 是 Spring 开源组织下的一个子项目,也是 Spring 组件一站式解决方案,主要是为了简化使用
    的头像 发表于 10-13 14:56 310次阅读
    <b class='flag-5'>Spring</b> Boot 的设计目标

    Spring Boot的启动原理

    可能很多初学者会比较困惑,Spring Boot 是如何做到将应用代码和所有的依赖打包成一个独立的 Jar 包,因为传统的 Java 项目打包成 Jar 包之后,需要通过 -classpath 属性
    的头像 发表于 10-13 11:44 369次阅读
    <b class='flag-5'>Spring</b> Boot的启动原理

    Spring Boot启动 Eureka流程

    在上篇中已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。 Spring Boot 启动 Eureka
    的头像 发表于 10-10 11:40 419次阅读
    <b class='flag-5'>Spring</b> Boot启动 Eureka流程

    Spring Boot Actuator快速入门

    不知道大家在写 Spring Boot 项目的过程中,使用过 Spring Boot Actuator 吗?知道 Spring Boot Actuator 是什么,干什么的吗?今天就要来给大家介绍
    的头像 发表于 10-09 17:11 340次阅读

    Spring Boot如何实现异步任务

    Spring Boot 提供了多种方式来实现异步任务,这里介绍三种主要实现方式。 1、基于注解 @Async @Async 注解是 Spring 提供的一种轻量级异步方法实现方式,它可以标记在方法
    的头像 发表于 09-30 10:32 488次阅读

    Spring Kafka的各种用法

    最近业务上用到了Spring Kafka,所以系统性的探索了下Spring Kafka的各种用法,发现了很多实用的特性,下面介绍下Spring Kafka的消息重试机制。 0. 前言 原生
    的头像 发表于 09-25 17:04 395次阅读

    Spring Boot 3.1 中如何整合Spring Security和Keycloak

    虽然Keycloak 团队宣布了不再对Spring Security提供适配,但Spring Security长期以来一直为OAuth和OIDC提供强大的内置支持。所以,只要我们理解Spring Security是如何处理OAu
    的头像 发表于 06-08 14:54 721次阅读
    <b class='flag-5'>Spring</b> Boot 3.1 中如何整合<b class='flag-5'>Spring</b> Security和Keycloak

    如何使用Spring Boot 2.x和Redis执行异步任务?

    Spring 是最流行 Java 应用程序开发框架。因此,Spring 社区也是最大的开源社区之一。除
    的头像 发表于 06-06 15:57 604次阅读
    如何使用<b class='flag-5'>Spring</b> Boot 2.x和Redis执行异步任务?

    Spring中11个最常用的扩展点分享2

    在使用spring的过程中,我们有没有发现它的扩展能力很强呢?由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中。今天我们主要来学习
    的头像 发表于 05-11 10:48 260次阅读

    Spring中11个最常用的扩展点分享1

    在使用spring的过程中,我们有没有发现它的扩展能力很强呢?由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中。今天我们主要来学习
    的头像 发表于 05-11 10:48 368次阅读

    Spring干掉原生JVM?

    这意味着,除了 Spring 诞生以来就支持的 Java 虚拟机,官方添加了使用 GraalVM 将 Spring 应用编译成原生镜像的 beta 支持,这样的话,就能提供一种新的方式来部署 Spring 应用。
    的头像 发表于 05-05 09:25 353次阅读
    <b class='flag-5'>Spring</b>干掉原生JVM?