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

Visindigo::Network::HttpReply Class

class Visindigo::Network::HttpReply

普通 HTTP 请求的句柄. 详情...

头文件: #include <Network/HttpRequest.h>
自以下版本: Visindigo 0.17.0
被继承:

Visindigo::Network::SSEReply

公开成员函数

(自 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():

除信号之外还提供一组回调糖(thenonErroronFrame 等), 它们等价于连接对应信号,只是为了链式书写与集中阅读:

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()

中止请求。若请求尚在队列中则直接出队,若已发出则关闭底层传输。

中止后句柄会依次发出 abortedfinished 信号,但不会发出 failed, 因为"被调用方主动放弃"与"请求失败"是两件事,用同一个信号表达会让错误处理 逻辑无法区分二者。

这个function 从 Visindigo 0.17.0 开始支持。

[signal, since Visindigo 0.17.0] void HttpReply::aborted()

请求被中止。主动 abort() 与上下文销毁导致的自动中止都会发出它。

Note: 中止之后不会再发出 succeededfailed

这个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)

请求结束,成功与失败都会发出。"无论如何都要收尾"的逻辑(例如解除加载状态) 挂在这里,比同时连接 succeededfailed 更不容易漏掉分支。

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)

响应头到达。此时 responseHttpResponse::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: 对流式请求而言,本回调表示"流正常结束",而不是"一次性拿到了全部内容"。 流中的每个事件应当通过 onFramewhen() 消费。

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 开始支持。