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 测试器 首先出现,并且从一开始就可用。

测试器确实证明了其价值并广受欢迎,但我们知道在 1.0 版本之前必须充分探索客户端,因为这两者密切相关,但具有略微不同的视角,并且我们希望确保它们彼此保持一致。

第二点是测试器支持在服务器端测试订阅,但不支持通过 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 测试器

GraphQL 测试器已更新以与新客户端保持一致。两者共享 GraphQL 传输的基础契约,因此测试器现在也支持 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 启动器

现在位于 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 社区中所有即将举行的活动。

查看全部