我有一个基本的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实例(此处已注释掉)在调试器中列为“”。这意味着我不确定。
感谢您提供任何帮助。