跳到正文
Yayin Story Studio Yayin Story Studio 项目文档

Visindigo::Network::HttpCenter Class

class Visindigo::Network::HttpCenter

通用 HTTP / HTTPS / WebSocket 请求中心. 详情...

头文件: #include <Network/HttpCenter.h>
自以下版本: Visindigo 0.17.0

公开成员函数

(自 Visindigo 0.17.0 引入) void abort(quint64 id)
(自 Visindigo 0.17.0 引入) void abortAll()
(自 Visindigo 0.17.0 引入) void abortByTag(const QString &tag)
(自 Visindigo 0.17.0 引入) void addRequestInterceptor(Visindigo::Network::HttpCenter::RequestInterceptor interceptor)
(自 Visindigo 0.17.0 引入) void addResponseInterceptor(Visindigo::Network::HttpCenter::ResponseInterceptor interceptor)
(自 Visindigo 0.17.0 引入) void clearInterceptors()
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply *get(const QUrl &url)
(自 Visindigo 0.17.0 引入) qint32 getActiveRequestCount() const
(自 Visindigo 0.17.0 引入) qint64 getAverageElapsedMs() const
(自 Visindigo 0.17.0 引入) QUrl getDefaultBaseUrl() const
(自 Visindigo 0.17.0 引入) qint32 getQueuedRequestCount() const
(自 Visindigo 0.17.0 引入) quint64 getTotalBytesReceived() const
(自 Visindigo 0.17.0 引入) quint64 getTotalBytesSent() const
(自 Visindigo 0.17.0 引入) quint64 getTotalFailureCount() const
(自 Visindigo 0.17.0 引入) quint64 getTotalRequestCount() const
(自 Visindigo 0.17.0 引入) quint64 getTotalRetryCount() const
(自 Visindigo 0.17.0 引入) bool isOnline() const
(自 Visindigo 0.17.0 引入) bool isPaused() const
(自 Visindigo 0.17.0 引入) Visindigo::Network::WebSocketSession *openWebSocket(const Visindigo::Network::WebSocketRequest &request)
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply *postJson(const QUrl &url, const Visindigo::Utility::JsonConfig &body)
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply *request(const Visindigo::Network::HttpRequest &request)
(自 Visindigo 0.17.0 引入) Visindigo::Network::SSEReply *request(const Visindigo::Network::SSERequest &request)
(自 Visindigo 0.17.0 引入) void resetStatistics()
(自 Visindigo 0.17.0 引入) void setAllowedUrlSchemes(const QStringList &schemes)
(自 Visindigo 0.17.0 引入) void setAuthProvider(Visindigo::Network::HttpCenter::AuthProvider provider)
(自 Visindigo 0.17.0 引入) void setCertificateVerificationEnabled(bool enabled)
(自 Visindigo 0.17.0 引入) void setCookieJarEnabled(bool enabled)
(自 Visindigo 0.17.0 引入) void setDefaultBaseUrl(const QUrl &baseUrl)
(自 Visindigo 0.17.0 引入) void setDefaultIdleTimeoutMs(qint32 ms)
(自 Visindigo 0.17.0 引入) void setDefaultRetryPolicy(const Visindigo::Network::RetryPolicy &policy)
(自 Visindigo 0.17.0 引入) void setDefaultTimeoutMs(qint32 ms)
(自 Visindigo 0.17.0 引入) void setDefaultUserAgent(const QString &userAgent)
(自 Visindigo 0.17.0 引入) void setLogSensitiveHeaders(bool enabled)
(自 Visindigo 0.17.0 引入) void setMaxConcurrentRequests(qint32 count)
(自 Visindigo 0.17.0 引入) void setMaxQueuedRequests(qint32 count)
(自 Visindigo 0.17.0 引入) void setPaused(bool paused)
(自 Visindigo 0.17.0 引入) void setProxy(const QUrl &proxy)

信号

(自 Visindigo 0.17.0 引入) void onlineStateChanged(bool online)
(自 Visindigo 0.17.0 引入) void requestFailed(quint64 id, const Visindigo::Network::HttpError &error)
(自 Visindigo 0.17.0 引入) void requestFinished(quint64 id, const Visindigo::Network::HttpResponse &response)
(自 Visindigo 0.17.0 引入) void requestStarted(quint64 id, const Visindigo::Network::HttpRequest &request)

静态公开成员

(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpCenter *getInstance()

详细说明

HttpCenter 是进程内单例,是本模块唯一的入口。它只补齐 Qt 没有提供的那一层, 并不重复实现 Qt 已有的能力:代理、Cookie、TLS 配置、网络可达性判断依旧由 Qt 的对应类承担,中心只是把它们收敛成统一的开关。

中心真正补上的是这些:

  • 并发上限与优先级队列,避免瞬时发起大量请求把连接池挤爆;
  • 带退避与抖动的自动重试,并默认只对幂等方法生效;
  • 自己实现的重定向跟随,因此可以阻止 https 降级并在跨源时剥离凭据;
  • 流式分帧交付,格式由解码器决定,中心本身对具体协议保持中立;
  • 全局的认证提供者与请求/响应拦截器;
  • 累计统计,以及按标签批量取消。

Warning: QNetworkAccessManager 必须在其所属线程的事件循环中工作,因此本单例 应在主线程、且 QCoreApplication 构造完成之后再创建。

Note: 给流式请求设置总超时会在时间到达后掐断长连接。长连接应当使用 Visindigo::Network::HttpRequest::setIdleTimeoutMs() 控制空闲超时。

成员函数文档

[since Visindigo 0.17.0] void HttpCenter::abort(quint64 id)

按下发时取得的编号中止请求,无论它正在排队还是已经发出。

id 请求编号。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::abortAll()

中止全部排队中与进行中的请求。进程退出前调用它可以避免回调在对象已经 析构之后才到达。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::abortByTag(const QString &tag)

中止所有带指定标签的请求。典型场景是某个界面关闭时,把该界面发起的全部 请求一并撤销,避免回调打到已经销毁的对象上。

tag 请求标签。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::addRequestInterceptor(Visindigo::Network::HttpCenter::RequestInterceptor interceptor)

追加一个请求拦截器,在请求提交时被调用,可以修改请求的头、体与地址。 多个拦截器按添加顺序执行。

Note: 拦截器只在提交时执行一次,不会在重试时重复执行。重试的语义是“把 同一个请求再发一次”,若拦截器每次都追加内容,重试发送的内容就与首次 不再相同,重试也就失去了可复现性。

interceptor 请求拦截器。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::addResponseInterceptor(Visindigo::Network::HttpCenter::ResponseInterceptor interceptor)

追加一个响应拦截器。它会在两个时机被调用一次:响应头到达时,以及请求 结束时(包括失败与中止)。因此实现必须自己处理“响应尚未收齐”的情形, 不能假设消息体已可用。

典型用途是埋点与统一日志:把状态码、耗时、错误分类记录到一处, 而不必在每个调用点重复写。

interceptor 响应拦截器。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::clearInterceptors()

清空全部请求与响应拦截器。

主要用途是测试:在用例之间恢复干净状态,避免上一个用例注册的拦截器 干扰下一个。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::HttpReply *HttpCenter::get(const QUrl &url)

以 GET 方法提交请求的便利入口。

url 目标地址。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] qint32 HttpCenter::getActiveRequestCount() const

返回正在进行中的请求数量。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] qint64 HttpCenter::getAverageElapsedMs() const

返回已完成请求的平均耗时毫秒数。没有可用样本时返回 0。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] QUrl HttpCenter::getDefaultBaseUrl() const

返回当前设置的默认基础地址,未设置时为空。

这个function 从 Visindigo 0.17.0 开始支持。

[static, since Visindigo 0.17.0] Visindigo::Network::HttpCenter *HttpCenter::getInstance()

取得中心实例,首次调用时创建。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] qint32 HttpCenter::getQueuedRequestCount() const

返回等待出队的请求数量。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] quint64 HttpCenter::getTotalBytesReceived() const

返回累计接收的消息体字节数。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] quint64 HttpCenter::getTotalBytesSent() const

返回累计发送的字节数。

Note: 该值由传输层上报,并非所有后端都会提供,因此在当前实现下可能恒为 0。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] quint64 HttpCenter::getTotalFailureCount() const

返回累计失败的请求数。失败包含超时、连接错误、非 2xx 状态码与队列拒绝, 但不包含调用方主动中止——主动放弃不算故障,否则统计会因正常的 界面关闭而变得很难解读。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] quint64 HttpCenter::getTotalRequestCount() const

返回自启动(或上次清零)以来提交过的请求总数,包含成功与失败。

Note: 计数在请求提交时递增,因此“已提交但仍在排队”的请求也已经计入。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] quint64 HttpCenter::getTotalRetryCount() const

返回累计发生的重试次数(不含首次发送)。

它是判断服务稳定性的重要指标:失败数与请求数之比可能很低,但重试数很高, 说明服务正在频繁抖动,只是恰好被重试策略掩盖了。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] bool HttpCenter::isOnline() const

判断当前是否具备网络可达性。该判断来自系统的网络状态通告, 它只说明"链路可达",不保证目标服务一定可用。

return 系统通告网络可达时返回 true。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] bool HttpCenter::isPaused() const

返回队列是否处于暂停状态。

return 暂停时返回 true。

这个function 从 Visindigo 0.17.0 开始支持。

[signal, since Visindigo 0.17.0] void HttpCenter::onlineStateChanged(bool online)

网络可达性发生变化。界面上的离线提示可以挂在这里,不必自己轮询。

online 网络是否可达。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::WebSocketSession *HttpCenter::openWebSocket(const Visindigo::Network::WebSocketRequest &request)

建立一个 WebSocket 会话。会话与 HTTP 句柄不同,默认不会自动销毁, 请在不再需要时明确关闭。

request WebSocket 连接描述。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::HttpReply *HttpCenter::postJson(const QUrl &url, const Visindigo::Utility::JsonConfig &body)

以 POST 方法提交 JSON 请求体的便利入口。

url 目标地址。 body 请求体 JSON。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::HttpReply *HttpCenter::request(const Visindigo::Network::HttpRequest &request)

提交一个普通 HTTP 请求,立即返回句柄。请求可能仍在排队,因此不要假设 返回时它已经发出。

返回的句柄默认在结束后自动销毁;若希望持有它以便稍后查询结果, 请先调用 Visindigo::Network::HttpReply::setAutoDelete()。

request 要提交的请求描述。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::SSEReply *HttpCenter::request(const Visindigo::Network::SSERequest &request)

提交一个 SSE 请求。中心会自动完成三件调用方不必操心的事:挂载 Visindigo::Network::SseDecoder、把接受类型设为 text/event-stream、 以及在设置了续传起点时补上 Last-Event-ID 请求头。

Note: 本重载与 request(const HttpRequest&) 的区分不是可有可无的:请求入队 必须拷贝调用方的对象,而拷贝一个 SSERequestHttpRequest 必然丢失 SSE 专属配置,所以类型必须在提交时就是明确的。

request 要提交的 SSE 请求描述。

这个function 从 Visindigo 0.17.0 开始支持。

[signal, since Visindigo 0.17.0] void HttpCenter::requestFailed(quint64 id, const Visindigo::Network::HttpError &error)

请求失败。被中止的请求不计入其中,它们只走 HttpReply::aborted

id 请求编号。 error 失败原因。

这个function 从 Visindigo 0.17.0 开始支持。

[signal, since Visindigo 0.17.0] void HttpCenter::requestFinished(quint64 id, const Visindigo::Network::HttpResponse &response)

请求成功结束。

id 请求编号。 response 最终响应。

这个function 从 Visindigo 0.17.0 开始支持。

[signal, since Visindigo 0.17.0] void HttpCenter::requestStarted(quint64 id, const Visindigo::Network::HttpRequest &request)

请求已提交。request 是中心补齐解码器、凭据与超时之后的最终形态, 而不是调用方传进来的那一份;排查问题时应当以它为准。

id 请求编号。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::resetStatistics()

清零累计统计。它不会影响进行中的请求,也不会改变实时状态计数。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setAllowedUrlSchemes(const QStringList &schemes)

设置允许请求的 URL 协议白名单,默认只允许 httpshttp。

不在白名单内的地址会在发出前就被拒绝,以 Visindigo::Network::HttpError::ErrorType::UrlSchemeRejected 失败,而不是 交给传输层去尝试。这可以防止调用方把用户可控的字符串直接当地址使用, 例如 file: 或 ftp: 这类会绕过 HTTP 栈语义的协议。

schemes 允许的协议白名单。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setAuthProvider(Visindigo::Network::HttpCenter::AuthProvider provider)

设置凭据提供者。仅当请求自身没有设置 Authorization 头时,中心才调用它。

它的价值在于把令牌刷新逻辑集中到一处:令牌快过期时只需要在一个地方续期, 而不必在每个发起请求的地方重复实现,也不会出现“某个调用点忘了带令牌”。

传入的地址是请求的目标地址,使提供者可以按域名返回不同服务商的凭据。

provider 凭据提供者。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setCertificateVerificationEnabled(bool enabled)

设置全局是否校验证书,默认 true。

全局开关与请求级 Visindigo::Network::HttpRequest::setVerifyTls() 是“与” 关系:只有两者都为真才会校验证书。这样全局关闭可以一次性放开所有请求, 而单个请求的关闭不会反过来影响其它请求。

Warning: 关闭它等同于放弃中间人防护,应仅在明确受控的场景下使用。

enabled 全局是否校验证书。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setCookieJarEnabled(bool enabled)

设置是否启用全局 Cookie 存储,默认关闭。

默认关闭是刻意的:Cookie 是全局共享状态,一旦自动携带,不同业务之间的 登录态会互相污染,而且很难在事后定位“为什么这个请求带上了别人的身份”。 需要维持会话的调用方应当显式开启,或自行管理 Cookie 头。

enabled 是否启用全局 Cookie 存储。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setDefaultBaseUrl(const QUrl &baseUrl)

设置默认基础地址。使用 Visindigo::Network::HttpRequest::setPath() 指定相对 路径的请求会基于它解析。

baseUrl 默认基础地址。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setDefaultIdleTimeoutMs(qint32 ms)

设置默认空闲超时毫秒数,即两次数据到达之间的最大间隔,默认 60000。 请求可用 Visindigo::Network::HttpRequest::setIdleTimeoutMs() 单独覆盖。

这是长连接唯一合适的超时形式:只要服务端持续推送数据,连接就不会被判 超时,而长时间没有字节到达则说明链路确实出了问题。

ms 默认空闲超时毫秒数。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setDefaultRetryPolicy(const Visindigo::Network::RetryPolicy &policy)

设置默认重试策略,作为模板应用于未自行设置过策略的请求。 请求一旦调用过 Visindigo::Network::HttpRequest::setRetryPolicy(), 就完全以它自己的设置为准,本项不再参与。

policy 默认重试策略。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setDefaultTimeoutMs(qint32 ms)

设置默认总超时毫秒数,默认 30000。请求可用 Visindigo::Network::HttpRequest::setTimeoutMs() 单独覆盖。

Note: 总超时对长连接是有害的:流式响应会在时间到达后被强行掰断。 流式请求应当改用 Visindigo::Network::HttpRequest::setIdleTimeoutMs()。

ms 默认总超时毫秒数。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setDefaultUserAgent(const QString &userAgent)

设置默认 User-Agent,请求未单独指定时使用。

userAgent 默认 User-Agent 取值。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setLogSensitiveHeaders(bool enabled)

设置请求日志是否包含敏感头部,默认关闭。

关闭时(默认)日志只记录方法与地址;打开后会额外输出完整请求头, 其中可能包含 Authorization 与 Cookie。因此本项只应在排查问题等临时场景下 打开,且不应随正式构建默认启用。

enabled 是否在日志中输出敏感头部。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setMaxConcurrentRequests(qint32 count)

设置同时进行的请求数上限,默认 6。超出的请求会排队等待。

count 并发请求数上限,最小为 1。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setMaxQueuedRequests(qint32 count)

设置等待队列长度上限,默认 128。队满时新请求会立即以 Visindigo::Network::HttpError::ErrorType::QueueRejected 失败, 而不是无限堆积。

count 等待队列长度上限。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] void HttpCenter::setPaused(bool paused)

暂停或恢复队列出队。暂停只影响尚未发出的请求,已经在传输中的请求会 继续完成——中途掐断它们既没有必要,也会让状态更难推理。

paused 是否暂停出队。

这个function 从 Visindigo 0.17.0 开始支持。

另请参阅 isPaused().

[since Visindigo 0.17.0] void HttpCenter::setProxy(const QUrl &proxy)

设置全局代理,传入空 URL 表示不使用代理。单个请求可通过 Visindigo::Network::HttpRequest::setProxyOverride() 覆盖本设置。

Note: 代理在传输层是按主机名匹配的,因此同一个主机在同一时刻只能 对应一个覆盖值:两个请求即使路径不同,只要是同一个主机名,就无法使用 不同的代理。这是 Qt 的 QNetworkProxyFactory 接口本身的限制。

proxy 代理地址;传空的 QUrl 表示不使用代理。

这个function 从 Visindigo 0.17.0 开始支持。