在finished()信号之后,无法在QNetworkReply中检索原始URL

时间:2014-06-29 11:09:03

标签: c++ qt networking

我有一个基本的Qt应用程序,它在循环中生成许多QNetworkRequests,使用QNetworkAccessManager在生成更多请求之前获取()它们。这很好用,我在QNAM的finished()插槽中得到了服务器的预期响应。

在处理QNetworkReply实例的插槽中,我必须从原始请求中获取许多项目,我通过提供给此函数的QNetworkReply实例中的request()函数获取该项目。我可以在原始请求中设置HTTP状态和原始标头。

但我无法检索原始URL,因为请求的url()函数不返回任何内容。我还尝试将URL设置为从QNAM获取的QNetworkReply指针上的属性,并在finished()槽中读取它,但由于某种原因,这也失败了。

主循环中的相关代码位:

for (int i = 0; i < hprCount; i++) {
        QNetworkRequest request;
        QMapIterator<QString, QString> it(headerParamResult[i]);
        while (it.hasNext()) {
            it.next();            
            request.setRawHeader(it.key().toLatin1(), it.value().toLatin1());
        }

        QString urlString = "";
        for (int j = 0; j < qprCount; j++) {
            QUrl url("http://localhost:8888/page");
            QMapIterator<QString, QString> jt(queryParamResult[j]);
            QUrlQuery query;
            while (jt.hasNext()) {
                jt.next();
                query.setProperty(jt.key(), jt.value());
            }

            request.setQuery(query);
            urlString = url.toString();
        }

        request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
        QNetworkReply* reply = testNam->get(request);
        reply->setProperty("url", QVariant(urlString));
        qApp->processEvents();
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(processHttpError(QNetworkReply::NetworkError)));
    }    

完成的插槽:

if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) { return; }

QNetworkRequest request = reply->request();
QList<QByteArray> headers = request.rawHeaderList();
QByteArray headersString;
for (int i = 0; i < headers.size(); i++) {
    headersString += headers[i];
}

/*QUrl reqUrl(reply->request().url());
QString url = reqUrl.toString();*/
QString url = reply->property("url").toString();

我最初使用的是我在开始时获得的单个QNetworkRequest实例,但这没有任何区别。来自property方法或url()函数的返回值始终为空字符串。

在调试器中,QUrl实例(此处已注释掉)在调试器中列为“”。这意味着我不确定。

感谢您提供任何帮助。

0 个答案:

没有答案