手记

Spring认证_什么是Spring GraphQL

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<WebOutput> 拦截(WebInput webInput, WebGraphQlHandler next) {

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

           Map<String, Object> map = ... ;

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

       });

       返回 next.handle(webInput);

   }

}

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

类 MyInterceptor 实现了 WebInterceptor {


   @覆盖

   public Mono<WebOutput> 拦截(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<String, Object> values) {

       if (values.containsKey(KEY)) {

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

       }

   }


   @覆盖

   public void resetValues(Map<String, Object> 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.ErrorClassification。Spring GraphQL 定义了一个ErrorType常见错误分类类别的枚举:

  • BAD_REQUEST

  • UNAUTHORIZED

  • FORBIDDEN

  • NOT_FOUND

  • INTERNAL_ERROR

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

未完待续……


0人推荐
随时随地看视频
慕课网APP