QGrpcInterceptorChain Class
存储并管理一组拦截器。更多内容...
| 标题: | #include <QGrpcInterceptorChain> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Grpc) target_link_libraries(mytarget PRIVATE Qt6::Grpc) |
| 自: | Qt 6.11 |
- 所有成员列表(包括继承的成员)
- QGrpcInterceptorChain 属于Qt GRPC 拦截器。
公共函数
| QGrpcInterceptorChain() | |
| QGrpcInterceptorChain(const QGrpcInterceptorChain &) | |
| ~QGrpcInterceptorChain() | |
| bool | add(T *interceptor) |
| bool | add(std::unique_ptr<T> &&interceptor) |
| QtGrpc::InterceptorCapabilities | capabilities() const |
| QtGrpc::InterceptorCapabilities | capabilitiesAt(qsizetype index) const |
| void | clear() |
| bool | empty() const |
| bool | hasHandlerFor(QtGrpc::InterceptorCapability cap) const |
| bool | isEmpty() const |
| bool | set(Ts *... interceptors) |
| bool | set(std::unique_ptr<Ts> &&... interceptors) |
| qsizetype | size() const |
| void | swap(QGrpcInterceptorChain &other) |
| QGrpcInterceptorChain & | operator=(const QGrpcInterceptorChain &) |
详细说明
QGrpcInterceptorChain 存储用于监视或修改 RPC 不同阶段的拦截器实例。该链在构造期间被传递给一个通道,并且该通道在其剩余生命周期内拥有该链。
随着 RPC 在其生命周期中进行,通道会在相应的拦截点调用存储在链中的拦截器。
拦截器按预定义的顺序添加到链中。顺序至关重要,它决定了在 RPC 的出站和入站阶段中拦截器被调用的方式。有关详细信息,请参阅《Qt GRPC 拦截器概述》中的“方向与流”部分。
可以通过两种主要的所有权模型添加拦截器:
- 拥有型:使用 `
std::unique_ptr<T>` 添加拦截器。若操作成功,链将取得所有权,并在链(以及相应的通道)被销毁时销毁这些拦截器。 - 非拥有模式:使用原始指针
T*添加拦截器。链不接管所有权。调用方必须确保拦截器对象在通道可能调用它们的整个期间内保持有效。
这两种模式可在同一链中混合使用。虽然系统支持混合使用拥有型和非拥有型拦截器,但需谨慎操作,以确保非拥有型拦截器的生命周期长于可能使用它们的所有通道。
注意:QGrpcInterceptorChain 不可复制,仅支持移动。
另请参阅 QtGrpc::InterceptorCapability 。
成员函数文档
QGrpcInterceptorChain::QGrpcInterceptorChain()
构建一个空的拦截器链。
[delete] QGrpcInterceptorChain::QGrpcInterceptorChain(const QGrpcInterceptorChain &)
复制并构造一个QGrpcInterceptorChain 实例。该函数已被删除。
[noexcept] QGrpcInterceptorChain::~QGrpcInterceptorChain()
摧毁拦截器链。
template <typename T> requires QtGrpcPrivate::if_interceptor<T> bool QGrpcInterceptorChain::add(T *interceptor)
将interceptor 添加到链中,但不获取其所有权。
如果拦截器已被添加,则返回true ;否则返回false 。
当通过原始指针设置拦截器时,调用方将保留所有权。QGrpcInterceptorChain 存储对所提供拦截器的非所有权引用。
拦截器链会被转移给通道并由通道拥有。因此,在使用该链的通道整个生命周期内,所有拦截器对象都必须保持有效。
以下代码演示了如何使用自定义删除器将拦截器的生命周期与单个通道绑定:
auto *metricsInterceptor = newMetricsInterceptor();
auto *authInterceptor = newAuthInterceptor();
~~~
QGrpcInterceptorChain chain;
if(!chain.add(metricsInterceptor))
qFatal("Failed to add metrics interceptor");
if(!chain.add(authInterceptor))
qFatal("Failed to add auth interceptor");
autochannel=std::shared_ptr<QGrpcHttp2Channel>(
newQGrpcHttp2Channel(QUrl("you_uri:port"),std::move(chain)),
[&metricsInterceptor, &authInterceptor](QGrpcHttp2Channel*ptr) {
deleteptr;
qDebug() << "Channel destroyed.";
// 如果这些拦截器未与任何其他通道共享,
// 这里是删除它们的合适位置。否则,其
// 生命周期必须在外部进行管理。
deletemetricsInterceptor;
deleteauthInterceptor;
metricsInterceptor=nullptr;
authInterceptor=nullptr;
}
);每种拦截器类型必须实现至少一个拦截器接口(例如,QGrpcStartInterceptor 或QGrpcFinishedInterceptor ),以提供拦截功能。
template <typename T> requires QtGrpcPrivate::if_interceptor<T> bool QGrpcInterceptorChain::add(std::unique_ptr<T> &&interceptor)
将interceptor 添加到拦截器链中,并将其所有权移交给自己。
如果拦截器已成功添加,则返回true ;否则返回false 。
只有当拦截器成功添加时,interceptor 的所有权才会转移给链。如果该函数返回false ,则所有权仍归调用者所有。
每种拦截器类型都必须实现至少一个拦截器接口(例如QGrpcStartInterceptor 或QGrpcFinishedInterceptor ),以提供拦截功能。
[noexcept] QtGrpc::InterceptorCapabilities QGrpcInterceptorChain::capabilities() const
返回链中存储的所有拦截器的综合能力。
返回值是各拦截器提供的权限的按位或运算结果。
另请参阅 hasHandlerFor()、capabilitiesAt() 以及QtGrpc::InterceptorCapability 。
QtGrpc::InterceptorCapabilities QGrpcInterceptorChain::capabilitiesAt(qsizetype index) const
返回拦截器在index 中提供的功能。
警告: 若传入的index 对于该拦截器链无效,调用 此函数将导致未定义行为。
另请参阅 capabilities() 和size()。
void QGrpcInterceptorChain::clear()
清除链。
从链中移除所有拦截器。该链所拥有的任何拦截器都将被销毁。
[noexcept] bool QGrpcInterceptorChain::empty() const
如果拦截器链中不包含任何拦截器,则返回 `true `;否则返回 `false`。
[noexcept] bool QGrpcInterceptorChain::hasHandlerFor(QtGrpc::InterceptorCapability cap) const
如果该链中包含至少一个为能力cap 提供处理程序的拦截器,则返回true ;否则返回false 。
另请参阅 capabilities() 和capabilitiesAt()。
[noexcept] bool QGrpcInterceptorChain::isEmpty() const
如果拦截器链中不包含任何拦截器,则返回 `true `;否则返回 `false`。
template <typename... Ts> requires QtGrpcPrivate::if_interceptor<Ts...> bool QGrpcInterceptorChain::set(Ts *... interceptors)
将链中的内容替换为interceptors ,但不获取其所有权。
如果所有拦截器均已成功添加,则返回true ;否则返回false ,并保持拦截链不变。
当通过原始指针设置拦截器时,调用方保留所有权。QGrpcInterceptorChain 存储对所提供拦截器的非所有权引用。
拦截器链将转移给通道并由通道拥有。因此,在使用该链的通道整个生命周期内,所有拦截器对象都必须保持有效。
以下代码演示了如何使用自定义删除器将拦截器的生命周期与单个通道绑定:
auto *metricsInterceptor = newMetricsInterceptor();
auto *authInterceptor = newAuthInterceptor();
~~~
QGrpcInterceptorChain chain;
if(!chain.set(metricsInterceptor,authInterceptor))
qFatal("Failed to set interceptors to chain");
autochannel=std::shared_ptr<QGrpcHttp2Channel>(
newQGrpcHttp2Channel(QUrl("you_uri:port"),std::move(chain)),
[&metricsInterceptor, &authInterceptor](QGrpcHttp2Channel*ptr) {
deleteptr;
qDebug() << "Channel destroyed.";
// 如果这些拦截器未与其他任何通道共享,
// 这里是删除它们的合适位置。否则,其
// 生命周期必须由外部进行管理。
deletemetricsInterceptor;
deleteauthInterceptor;
metricsInterceptor=nullptr;
authInterceptor=nullptr;
}
);每种拦截器类型都必须实现至少一个拦截器接口(例如,QGrpcStartInterceptor 或QGrpcFinishedInterceptor ),以提供拦截功能。
template <typename... Ts> requires QtGrpcPrivate::if_interceptor<Ts...> bool QGrpcInterceptorChain::set(std::unique_ptr<Ts> &&... interceptors)
将链中的内容替换为interceptors ,并取得对其的所有权。
如果所有拦截器均添加成功,则返回true ;否则返回false ,并保持拦截器链不变。
拦截器的处理顺序与传递给该函数时的顺序一致。如果所有添加操作均成功,则链将被按该顺序替换为新的拦截器。
所有权会在处理拦截器时逐步转移。如果操作失败,失败前已成功添加的任何拦截器都会被销毁,而剩余的(尚未处理的)unique_ptrs 仍保持有效。
每种拦截器类型都必须实现至少一个拦截器接口(例如,QGrpcStartInterceptor 或QGrpcFinishedInterceptor ),以提供拦截功能。
[noexcept] qsizetype QGrpcInterceptorChain::size() const
返回链中存储的拦截器数量。
另请参阅 isEmpty()。
[noexcept] void QGrpcInterceptorChain::swap(QGrpcInterceptorChain &other)
将other 与该对象互换。此操作速度极快,且绝不会失败。
[delete] QGrpcInterceptorChain &QGrpcInterceptorChain::operator=(const QGrpcInterceptorChain &)
将other 复制并赋值给该QGrpcInterceptorChain 实例。此函数已被删除。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.