Visindigo::Network::HttpReply Class
class Visindigo::Network::HttpReply普通 HTTP 请求的句柄. 详情...
| 头文件: | #include <Network/HttpRequest.h> |
| 自以下版本: | Visindigo 0.17.0 |
| 被继承: |
公开成员函数
(自 Visindigo 0.17.0 引入) void | abort() |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | bindLifecycleTo(QObject *context) |
(自 Visindigo 0.17.0 引入) quint64 | getId() const |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpRequest | getRequest() const |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpResponse | getResponse() const |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply::State | getState() const |
(自 Visindigo 0.17.0 引入) QString | getTag() const |
(自 Visindigo 0.17.0 引入) bool | isAutoDelete() const |
(自 Visindigo 0.17.0 引入) bool | isRunning() const |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onAborted(QObject *context, std::function<void ()> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onError(QObject *context, std::function<void (const HttpError &)> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onFinally(QObject *context, std::function<void ()> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onFrame(QObject *context, std::function<bool (const StreamFrame &)> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onHeaders(QObject *context, std::function<void (const HttpResponse &)> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onProgress(QObject *context, std::function<void (qint64, qint64)> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onRawChunk(QObject *context, std::function<bool (const QByteArray &)> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onRetrying(QObject *context, std::function<void (qint32, qint32, const HttpError &)> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onStarted(QObject *context, std::function<void (quint64)> fn) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | onUploadProgress(QObject *context, std::function<void (qint64, qint64)> fn) |
(自 Visindigo 0.17.0 引入) void | setAutoDelete(bool autoDelete) |
(自 Visindigo 0.17.0 引入) Visindigo::Network::HttpReply & | then(QObject *context, std::function<void (const HttpResponse &)> fn) |
(自 Visindigo 0.17.0 引入) int | waitForFinished(qint32 timeoutMs = -1) |
信号
(自 Visindigo 0.17.0 引入) void | aborted() |
(自 Visindigo 0.17.0 引入) void | bodyChunkReceived(const QByteArray &chunk) |
(自 Visindigo 0.17.0 引入) void | downloadProgress(qint64 received, qint64 total) |
(自 Visindigo 0.17.0 引入) void | failed(const Visindigo::Network::HttpError &error) |
(自 Visindigo 0.17.0 引入) void | finished(const Visindigo::Network::HttpResponse &response) |
(自 Visindigo 0.17.0 引入) void | frameReceived(const Visindigo::Network::StreamFrame &frame) |
(自 Visindigo 0.17.0 引入) void | headersReceived(const Visindigo::Network::HttpResponse &response) |
(自 Visindigo 0.17.0 引入) void | queued(quint64 id) |
(自 Visindigo 0.17.0 引入) void | retrying(qint32 attempt, qint32 delayMs, const Visindigo::Network::HttpError &lastError) |
(自 Visindigo 0.17.0 引入) void | started(quint64 id) |
(自 Visindigo 0.17.0 引入) void | succeeded(const Visindigo::Network::HttpResponse &response) |
(自 Visindigo 0.17.0 引入) void | uploadProgress(qint64 sent, qint64 total) |
详细说明
HttpReply 是调用方与一次请求交互的窗口。它由 Visindigo::Network::HttpCenter 在提交请求时创建并返回,调用方只持有指针, 无法自行构造。
底层传输天然是字节流,"一次性请求""文件下载""文本流"在本模块里都是同一个 类,差别只在请求上设置的 HttpRequest::BodySink 与 Visindigo::Network::HttpRequest::setStreamDecoder():
- HttpRequest::BodySink::Auto、HttpRequest::BodySink::Buffer: 请求结束后从 getResponse() 的 HttpResponse::getBody() 取走内容。
- HttpRequest::BodySink::ToFile:内容增量写入磁盘, downloadProgress 可作为进度显示,文件路径见 Visindigo::Network::HttpResponse::getDownloadFilePath()。
- 挂了解码器时:字节按帧切分,经 frameReceived 交付。
除信号之外还提供一组回调糖(then、onError、onFrame 等), 它们等价于连接对应信号,只是为了链式书写与集中阅读:
center->request(request) ->then(this, [](const HttpResponse& response) { ... }) ->onError(this, [](const HttpError& error) { ... });
带 context 的重载遵循 Qt 惯例,context 销毁后连接自动断开,因此不会在对象 已销毁之后回调。但要注意"不再回调"并不等于"连接已关闭",长连接场景应当 使用 bindLifecycleTo() 才能真正把请求停掉。
Note: 请求结束时若 isAutoDelete() 为 true (默认值),句柄会自动 deleteLater,因此不要在提交后长期保存这个指针;需要事后查询结果时, 应先调用 setAutoDelete(false) 并自行负责释放。
Note: 对设置了流式解码器的请求,then 的语义是"流正常结束",而不是 "已经拿到了全部内容"——内容是在 frameReceived 中陆续交付的。
另请参阅 Visindigo::Network::HttpRequest, Visindigo::Network::HttpResponse, and Visindigo::Network::SSEReply.
成员函数文档
[since Visindigo 0.17.0] void HttpReply::abort()
中止请求。若请求尚在队列中则直接出队,若已发出则关闭底层传输。
中止后句柄会依次发出 aborted 与 finished 信号,但不会发出 failed, 因为"被调用方主动放弃"与"请求失败"是两件事,用同一个信号表达会让错误处理 逻辑无法区分二者。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::aborted()
请求被中止。主动 abort() 与上下文销毁导致的自动中止都会发出它。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::bindLifecycleTo(QObject *context)
把请求的生命周期绑定到另一个对象上:该对象被销毁时,请求自动中止。
这与回调糖的 context 参数解决的并不是同一个问题。回调的 context 只能保证 "对象销毁后不再回调",但底层连接仍在继续传输,对长连接而言这意味着持续的 流量与资源占用。本函数会真正把连接关掉,因此流式请求应当调用它。
context 要绑定到的对象;传 nullptr 表示不绑定。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::bodyChunkReceived(const QByteArray &chunk)
未被缓存到内存的原始增量字节。
Note: chunk 的切分位置没有任何语义,不能假定它与协议边界对齐; 需要按帧处理时请使用 frameReceived。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::downloadProgress(qint64 received, qint64 total)
下载进度。total 为 -1 表示长度未知,分块传输与流式响应都属此列。
received 已接收字节数。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::failed(const Visindigo::Network::HttpError &error)
请求失败。error 给出分类与原因,是否值得重试见其 Retryable 字段。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::finished(const Visindigo::Network::HttpResponse &response)
请求结束,成功与失败都会发出。"无论如何都要收尾"的逻辑(例如解除加载状态) 挂在这里,比同时连接 succeeded 与 failed 更不容易漏掉分支。
response 最终响应。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::frameReceived(const Visindigo::Network::StreamFrame &frame)
解码器切出的完整帧。仅在请求挂了 Visindigo::Network::IStreamDecoder 时发出。
frame 已切出的完整帧。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] quint64 HttpReply::getId() const
返回句柄的编号。它在进程内唯一,可用于日志关联,也是 Visindigo::Network::HttpCenter::abort() 的入参。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpRequest HttpReply::getRequest() const
返回本次请求使用的描述对象副本。跟随重定向或应用拦截器都不会改写它, 因此它始终是调用方最初提交的那一份设置。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpResponse HttpReply::getResponse() const
返回当前已知的响应。响应头尚未到达时其 isValid() 为 false。 请求结束后可通过 getState() 判断它是成功还是失败的结果。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply::State HttpReply::getState() const
返回句柄当前所处的状态。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] QString HttpReply::getTag() const
返回请求携带的标签,未设置时为空字符串。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::headersReceived(const Visindigo::Network::HttpResponse &response)
响应头到达。此时 response 的 HttpResponse::isValid() 为 true, 但消息体尚未入场,HttpResponse::getBody() 还是空的。
这是下载开始之前校验状态码、并据此决定要不要 abort() 的唯一时机。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] bool HttpReply::isAutoDelete() const
返回句柄是否会在结束后自动销毁,默认 true。
return 会自动销毁时返回 true。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] bool HttpReply::isRunning() const
判断请求是否仍在进行中。
return 请求仍在进行中时返回 true。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onAborted(QObject *context, std::function<void ()> fn)
注册被中止的回调。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onError(QObject *context, std::function<void (const HttpError &)> fn)
注册失败回调,等价于连接 failed 信号。主动 abort() 不会触发本回调。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onFinally(QObject *context, std::function<void ()> fn)
注册结束回调,无论成功、失败还是被中止都会触发。适合放置"关闭进度条"这类 必须执行的收尾动作。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onFrame(QObject *context, std::function<bool (const StreamFrame &)> fn)
注册已解码帧的回调,处理器返回 false 表示立即中止请求。
未配置解码器时本回调不会被触发,因此它通常与 Visindigo::Network::HttpRequest::setStreamDecoder() 配合使用。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数,返回 false 表示立即中止请求。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onHeaders(QObject *context, std::function<void (const HttpResponse &)> fn)
注册响应头到达的回调,等价于连接 headersReceived 信号。
这是校验状态码的最佳时机:对下载任务而言,此刻一个字节都还没有写入目标文件, 发现状态码不对就直接 abort(),不会留下任何残缺文件。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onProgress(QObject *context, std::function<void (qint64, qint64)> fn)
注册下载进度回调。total 为 -1 表示服务端未给出长度,此时只能显示已接收字节数。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onRawChunk(QObject *context, std::function<bool (const QByteArray &)> fn)
注册原始字节增量回调。处理器返回 false 表示本次请求应当立即中止, 这是流式解析中最常用的提前退出手段——例如已经解析到需要的字段时。
Note: 只有字节未被完整缓存时才逐块交付,即落盘或流式场景。若响应走内存缓存, 用 then 一次性取走即可,逐块回调反而是多余的拷贝。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数,返回 false 表示立即中止请求。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onRetrying(QObject *context, std::function<void (qint32, qint32, const HttpError &)> fn)
注册即将重试的回调。可用于向用户提示"网络不稳定,正在重试"。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onStarted(QObject *context, std::function<void (quint64)> fn)
注册请求开始发出的回调,等价于连接 started 信号。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::onUploadProgress(QObject *context, std::function<void (qint64, qint64)> fn)
注册上传进度回调。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::queued(quint64 id)
请求已进入中心队列但尚未发出。id 是句柄编号,与 getId() 一致。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::retrying(qint32 attempt, qint32 delayMs, const Visindigo::Network::HttpError &lastError)
即将重试。attempt 是第几次重试(从 1 开始),delayMs 是即将等待的 毫秒数,lastError 是触发重试的那次失败。
Note: 重试的是整个请求,请求体会被重新发送,这是默认只对幂等方法重试的原因。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] void HttpReply::setAutoDelete(bool autoDelete)
设置结束后是否自动销毁。
Note: 把默认值改为 false 之后,释放句柄的责任就转移到调用方, 必须自行在适当的时机 delete,否则每次请求都会泄漏一个句柄。
autoDelete 是否在结束后自动销毁。
这个function 从 Visindigo 0.17.0 开始支持。
另请参阅 isAutoDelete().
[signal, since Visindigo 0.17.0] void HttpReply::started(quint64 id)
请求真正被送出。排队中的请求不会发这个信号,因此"已排队"与"已发出" 是两个可以区分的状态。
id 句柄编号。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::succeeded(const Visindigo::Network::HttpResponse &response)
请求成功结束。response 是最终结果。
Note: 它只说明这次 HTTP 交互成功(收到了 2xx 且未被中止),不代表业务成功。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] Visindigo::Network::HttpReply &HttpReply::then(QObject *context, std::function<void (const HttpResponse &)> fn)
注册成功回调。
Note: 对流式请求而言,本回调表示"流正常结束",而不是"一次性拿到了全部内容"。 流中的每个事件应当通过 onFrame 或 when() 消费。
context 回调的宿主对象;传 nullptr 表示使用句柄自身。 fn 回调函数。
这个function 从 Visindigo 0.17.0 开始支持。
[signal, since Visindigo 0.17.0] void HttpReply::uploadProgress(qint64 sent, qint64 total)
上传进度。total 为 -1 表示长度未知。
sent 已发送字节数。
这个function 从 Visindigo 0.17.0 开始支持。
[since Visindigo 0.17.0] int HttpReply::waitForFinished(qint32 timeoutMs = -1)
阻塞等待请求结束,返回结果或错误。timeoutMs 为 -1 表示不设额外上限。
Warning: 本函数内部运行局部事件循环,在 UI 线程使用会让界面卡住不动, 并且可能重入其它事件处理逻辑。它只适合在后台线程或初始化阶段使用。
这个function 从 Visindigo 0.17.0 开始支持。