Spring for GraphQL 1.0 里程碑 6 发布

工程 | Rossen Stoyanchev | 2022年3月22日 | ...

我谨代表所有参与者,非常高兴地宣布 Spring for GraphQL 1.0 的第六个也是最后一个里程碑版本现已发布。我们的下一站是 4 周后的 RC1,随后在 5 月 17 日发布 GA 版本。

GraphQL 客户端

GraphQL 客户端是我们很早就确定的一个目标。在当前的问题跟踪器中,它是 336 个问题中的第 10 个。但我们认为测试支持的优先级更高,所以 GraphQL Tester 先于它出现,并且从一开始就可用。

Tester 证明是有价值且受欢迎的,但我们知道在 1.0 版本之前必须完全探索客户端,因为两者密切相关但视角略有不同,我们希望确保它们相互协调。

第二个要点是,Tester 支持服务器端的测试订阅,但不支持通过 WebSocket 进行测试订阅。这一点很重要,因为与 HTTP 不同,HTTP 中一个 GraphQL 请求对应一个 HTTP 请求,而在 WebSocket 中,多个 GraphQL 请求共享同一个连接,这是一个根本不同的操作模式。例如,WebSocket 传输需要在发出请求时透明地连接,确保单个共享连接,管理其生命周期,并且作为一个长期连接,提供启动和停止的控制。

我很高兴地说,里程碑 6 包括了一个 GraphQL 客户端。它支持通过 HTTP 的单个响应请求(查询和突变),以及通过 WebSocket 的订阅、查询和突变。

一些示例用法

String document = "{" +
        "  project(slug:\"spring-framework\") {" +
        "   name" +
        "   releases {" +
        "     version" +
        "   }"+
        "  }" +
        "}";

Mono<Project> projectMono = graphQlClient.document(document)
        .retrieve("project")
        .toEntity(Project.class);

响应数据被解码为 Project。请求文档也可以存储在文件中,并通过一个简单的名称(例如“project”)来引用,或者你可以通过代码生成的请求来创建它,例如来自 Netflix DGSGraphQLQueryRequest

订阅的一些示例用法

Flux<String> projectFlux = client.document("subscription { projects { name } }")
        .retrieveSubscription("projects")
        .toEntity(Project.class);

还有很多内容有待发现。请参阅参考文档中新的 客户端部分

GraphQL Tester

GraphQL Tester 已更新,以与新客户端保持一致。两者共享 GraphQL 传输的底层合同,因此 Tester 现在也支持 WebSocket。

API 的部分内容发生了变化,部分原因是与客户端保持一致,也出于其他原因,例如使用正确的术语并避免过度使用 query 等。有关更多详细信息,请参阅 此问题 和链接。

一个值得注意的 API 更改是使用一个专用类型来表示 GraphQL 错误,该类型还将错误路径公开为“.”分隔的字符串(例如“project.name”),这使得通过字符串比较来检查预期的字段错误变得非常容易。

检查给定 JSON 路径下的响应数据的选择也缩小了范围,以提供更多指导并专注于重要内容。这些选项包括字段的 hasValueisNulldoesNotExist,此外还可以选择解码为更高级别的对象以进行进一步断言。

Spring Security

Spring Security 用户会熟悉 @AuthenticationPincipal 注解,您现在可以在数据控制器的 @SchemaMapping 方法的参数上使用它。这提供了对 Spring Security 认证中的 Principal 的访问。

参数绑定

到目前为止,您已经可以使用 @Argument 将特定参数绑定到您选择的对象。现在您可以使用 @Arguments 将完整的参数映射绑定到对象。

GraphQL 参数可以是具有嵌套对象或嵌套对象列表的复杂输入类型。参数绑定功能支持将其映射到匹配的 Java 对象结构,包括对构造函数和属性初始化的支持,以及对标量值的类型转换。这使得处理可能在任何级别发生的转换和其他初始化错误变得具有挑战性。

参数绑定现在会引发 BindException,其中包含所有累积的错误。绑定算法现在不会在第一个错误时停止,而是继续累积尽可能多的错误。每个错误都包含一个 field 属性,该属性是指向发生错误的参数的“.”分隔路径。

API 更改

本次发布包括一些 API 更改。在大多数情况下,这些更改应该很容易解决,并且不会造成困难。其中大部分是由引入客户端驱动的,以确保客户端和服务器之间的对称性和一致的命名。

预计这将是最后一个这样大规模的更改。RC1 版本在向后兼容性更改方面应该相当平稳,此后 API 将保持稳定。

Boot Starter

现在位于 Spring Boot 本身的 Spring for GraphQL Boot 启动器已遵循所有更改。最新的 Spring Boot 2.7 快照已更新,并且 2.7 M3 版本将于本周四发布。

社区

最后但同样重要的是,感谢您在 Spring for GraphQL 问题跟踪器中提供的持续反馈和讨论。我们非常感谢,因为它使项目更加强大和更好!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有