Qt GRPC 客户端拦截器
简介
Qt GRPC 提供了使用 Qt GRPC 拦截器来自定义 Qt GRPC 调用和流的特性的功能。`QGrpcClientInterceptor` 类用作创建自定义拦截器的基础,而 `QGrpcClientInterceptorManager` 管理这些拦截器的注册和执行。
实现自定义拦截器
要实现自定义拦截器,需要继承 `QGrpcClientInterceptor` 并重写所需的拦截方法。
这些方法针对 Qt GRPC 操作类型而特定
- QGrpcClientInterceptor::interceptCall() - 用于单一调用。
- QGrpcClientInterceptor::interceptServerStream() - 用于服务器流调用。
- QGrpcClientInterceptor::interceptClientStream() - 用于客户端流调用。
- QGrpcClientInterceptor::interceptBidirStream() - 用于双向流调用。
这里是一个实现自定义拦截器的示例
class MyCustomInterceptor : public QGrpcClientInterceptor { protected: void interceptCall(std::shared_ptr<QGrpcChannelOperation> operation, std::shared_ptr<QGrpcCallReply> response, QGrpcInterceptorContinuation<QGrpcCalReply> &continuation) { // Interception logic here. // Call continuation() delegate if you wish to continue interception chain continuation(response, operation); } };
默认情况下,`QGrpcClientInterceptor` 方法在无逻辑的情况下调用 continuation() 委托。
continuation() 委托
continuation() 被调用的次数取决于应用程序的确切要求。例如,考虑一个重试拦截器;在需要额外尝试的情况下,continuation 可能会被反复调用。相反,当拦截响应时,您可以选择在您的逻辑之前调用 continuation。另一方面,某些拦截器(如专注于身份验证或缓存的拦截器)可能会发现,如果确定最终的 Qt GRPC 调用是不必要的,则根本不需要调用 continuation。
注册拦截器
要将拦截器结合到您的 Qt GRPC 工作流程中,请使用 `QGrpcClientInterceptorManager`。此管理器允许系统地注册和协调拦截器。您可以使用 registerInterceptor() 方法添加单个拦截器,而一次可以通过 registerInterceptors() 方法注册多个拦截器。
拦截器链执行顺序
注册后,拦截器被放置在链的起始位置。需要注意的是,在执行过程中,拦截器是以相反顺序处理的。例如,让我们考虑一个场景,其中已按顺序注册了三个拦截器(InterceptorA、InterceptorB 和 InterceptorC)
QGrpcClientInterceptorManager manager; auto InterceptorA = std::make_shared<MyCustomInterceptor>(); auto InterceptorB = std::make_shared<MyCustomInterceptor>(); auto InterceptorC = std::make_shared<MyCustomInterceptor>(); manager.registerInterceptor(InterceptorA); manager.registerInterceptors({InterceptorB, InterceptorC});
在这种情况下,Qt GRPC 调用的拦截器链将是以下内容
InterceptorB -> InterceptorC -> InterceptorA -> Qt GRPC operation
运行拦截器链
拦截器链由QAbstractGrpcChannel在每次发起调用或流时触发。此通道包装Qt GRPC调用并将其传递给拦截器链。链中的拦截器根据其特定逻辑处理调用。最终,Qt GRPC调用在拦截器链的末尾调用,确保它在到达目的地之前完成所有必要的处理。
将QGrpcClientInterceptorManager连接到通道
要将QGrpcClientInterceptorManager添加到通道,您可以使用QAbstractGrpcChannel::addInterceptorManager()方法。此方法需要一个QGrpcClientInterceptorManager对象作为参数。提供的manager将随后与通道关联,允许它管理传入和传出的Qt GRPC调用和流中的拦截器。
QGrpcClientInterceptor示例
© 2024 Qt公司有限公司。此处提供的文档贡献的版权属于其各自的拥有者。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可的。Qt及其相关徽标是芬兰和/或世界其他国家的Qt公司有限责任公司的商标。所有其他商标均为各自所有者的财产。