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_REQUEST
UNAUTHORIZED
FORBIDDEN
NOT_FOUND
INTERNAL_ERROR
应用程序可以使用它来分类错误。如果它错误解决,则默认情况下将标记为INTERNAL_ERROR。
未完待续……