前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring认证_什么是Spring GraphQL

Spring认证_什么是Spring GraphQL

原创
作者头像
IT胶囊
修改2021-08-06 14:30:38
2.9K0
修改2021-08-06 14:30:38
举报
文章被收录于专栏: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可以通过声明一个RouterFunction bean 并使用RouterFunctions来自 Spring MVC 或 WebFlux 的来创建路由来作为 HTTP 端点公开。Boot starter 执行此操作。

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

网络套接字

GraphQlWebSocketHandler基于graphql-ws库中定义 的协议通过 WebSocket 请求处理 GraphQL 。在 WebSocket 上使用 GraphQL 的主要原因是订阅,它允许发送 GraphQL 响应流,但它也可以用于具有单个响应的常规查询。处理程序将每个请求委托给Web 拦截链以进一步执行请求。

有两种变体GraphQlWebSocketHandler,一种用于 Spring MVC,一种用于 Spring WebFlux。两者都异步处理请求并具有等效的功能。WebFlux 处理程序还使用非阻塞 I/O 和背压来流式传输消息,这很有效,因为在 GraphQL Java 中订阅响应是 Reactive Streams Publisher

graphql-ws项目列出了许多供客户使用的 配方。

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

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

网页拦截

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

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

class MyInterceptor implements WebInterceptor {

@Override

public Mono<WebOutput> intercept(WebInput webInput, WebGraphQlHandler next) {

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

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

return builder.extensions(map).build();

});

return next.handle(webInput);

}

}

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

class MyInterceptor implements WebInterceptor {

@Override

public Mono<WebOutput> intercept(WebInput webInput, WebGraphQlHandler next) {

return next.handle(webInput)

.map(webOutput -> {

Object data = webOutput.getData();

Object updatedData = ... ;

return webOutput.transform(builder -> builder.data(updatedData));

});

}

}

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

查询执行

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()支持ReactiveDataFetcher、Context Propagation和 Exception Resolution。

反应式 DataFetcher

默认GraphQlSource构建器启用对 aDataFetcher返回Mono 或 的支持Flux。无论返回类型适合在一个CompletableFutureFlux聚集,变成了一个列表值,除非请求是GraphQL订阅请求,在这种情况下返回值保持在无流Publisher的流GraphQL响应。

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

上下文传播

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

网管

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

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

public class RequestAttributesAccessor implements ThreadLocalAccessor {

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

@Override

public void extractValues(Map<String, Object> container) {

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

}

@Override

public void restoreValues(Map<String, Object> values) {

if (values.containsKey(KEY)) {

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

}

}

@Override

public void resetValues(Map<String, Object> values) {

RequestContextHolder.resetRequestAttributes();

}

}

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

网络流量

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

异常解决

GraphQL Java 应用程序可以注册 aDataFetcherExceptionHandler来决定如何在 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

未完待续......

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 网络传输
    • HTTP
    • 网络套接字
    • 网页拦截
    • 查询执行
      • GraphQLSource
      • 反应式 DataFetcher
      • 上下文传播
      • 网管
      • 网络流量
      • 异常解决
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档