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

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,或检查GraphQlWebMvcAutoConfiguration或GraphQlWebFluxAutoConfiguration配置。

查询执行

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。报道查看无论类型适合在一个CompletableFuture与Flux聚集,变成了一个列表值,除非请求是GraphQL订阅请求,这种在情况下报道查看值保持在无流Publisher的流GraphQL响应。

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

大约传播

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

网管

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

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

公共类 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 组件,直到将解析Exception为graphql.GraphQLError对象列表。

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

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

BAD_REQUESTUNAUTHORIZEDFORBIDDENNOT_FOUNDINTERNAL_ERROR

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

未完待续……



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