Qt GRPC 客户端拦截器

简介

Qt GRPC 提供了使用 Qt GRPC 拦截器来自定义 Qt GRPC 调用和流的特性的功能。`QGrpcClientInterceptor` 类用作创建自定义拦截器的基础,而 `QGrpcClientInterceptorManager` 管理这些拦截器的注册和执行。

实现自定义拦截器

要实现自定义拦截器,需要继承 `QGrpcClientInterceptor` 并重写所需的拦截方法。

这些方法针对 Qt GRPC 操作类型而特定

这里是一个实现自定义拦截器的示例

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示例

另请参阅QGrpcClientInterceptorQGrpcClientInterceptorManager

© 2024 Qt公司有限公司。此处提供的文档贡献的版权属于其各自的拥有者。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可的。Qt及其相关徽标是芬兰和/或世界其他国家的Qt公司有限责任公司的商标。所有其他商标均为各自所有者的财产。