C++ Qt 从 QNetworkRequest 获取 HTTP header

标签 c++ qt http-headers qnetworkaccessmanager

我正在开发 Qt C++ 应用程序。我需要下载一些文件(可能很大)并向用户显示下载进度。为了执行此任务,我使用以下代码:

QNetworkAccessManager* networkManager = new QNetworkAccessManager();

QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);
QNetworkReply reply = networkManager->get(request);
QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
                 this, SLOT(downloadProgressChanged(qint64,qint64)));

其中 downloadProgressChanged 是带有此代码的插槽:

void downloadProgressChanged(qint64 downloaded, qint64 total)
{
    ui->progressBar->setValue(ui->progressBar->value() + 1);
    ui->labelProgress->setText(QString::number((downloaded / 1024)));
}

(我使用名为 progressBar 的 QProgressBar 来显示进度,使用名为 labelProgress 的 QLabel 来显示下载的千字节数)。

我的问题是我无法访问 Content-Length header (int fileSize 值为 0),因此我无法显示操作进度。我在我的网络服务器上检查了 HTTP header - Content-Length 工作正常。

this SO question我读到我可以使用 QNetworkReply::metaDataChanged() 信号,但我如何使用它来显示进度?文档说当下载已经开始时可以发出信号,但我需要在下载开始之前获取标题内容 - 以设置我的进度条。

最佳答案

这不是您从请求中获取 header 信息的方式:

QNetworkRequest request(fileUrl); //fileUrl is a QUrl variable
QVariant responseLength = request.header(QNetworkRequest::ContentLengthHeader);
int fileSize = responseLength.toInt();
ui->progressBar->setMaximum(fileSize);

尝试使用 QNetworkAccessManager 发出请求,然后从它返回的回复中获取您想要的 header 。有一种特殊的方法可以仅从请求中检索 header 信息:

QNetworkAccessManager::head(const QNetworkRequest & request)

由于Qt的网络API是异步的,你必须将QNetworkAccessManager的finished(QNetworkReply*)信号连接到一个slot,并在slot中获取header信息。

这是我的做法:

void MainWindow::on_download_button_clicked(){
    QUrl url("http://someurl");
    QNetworkAccessManager * manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getHeaders(QNetworkReply*)));
    manager->head(QNetworkRequest(url));
}

void MainWindow::getHeaders(QNetworkReply * reply){
    if (reply->operation() == QNetworkAccessManager::HeadOperation){
        int content_length = reply->header(QNetworkRequest::ContentLengthHeader).toInt();
    }
}

关于C++ Qt 从 QNetworkRequest 获取 HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16086077/

相关文章:

c++ - 是否可以比较#ifdef 值以供有条件使用

qt - 调整 qt-label 内图像的大小

javascript - 在表单提交 CasperJS 中发送 http header

javascript - OpenCV Rect 约定——什么是 x、y、宽度、高度?

c++ - 如何按值对 C++ 中的映射进行排序,但如果键值相等?

c++ - 如何从多个组播远程接口(interface)接收?

python - 如何找到用循环创建的QButton?

c++ - 从 Windows 上的 QCamera 获取支持的像素格式

ios - 如何解决这个问题 "Ambiguous reference to member ' dataTask(with :completionHandler: )' "

PHP file_get_contents() 和设置请求 header