共计 4360 个字符,预计需要花费 11 分钟才能阅读完成。
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。
未完待续……