如何避免QNetworkAccessManager多个POST请求?

时间:2016-02-03 10:23:07

标签: qt networking qt-creator qnetworkaccessmanager qnetworkreply

我已经实现了对我的应用程序的发布请求,如下所示:

QNetworkRequest req;
QUrl url = "Http://" + ipaddress + "/goform/executeSomething";
req.setUrl(url);

QHttpMultiPart * postBody = new QHttpMultiPart(QHttpMultiPart::FormDataType, this);
QHttpPart part;
part.setRawHeader("Content-Disposition","form-data; name=\"action\"");
part.setBody("Action");
postBody->append(part);

req.setRawHeader("Authorization","Basic " + credentials);
req.setRawHeader("Content-Type", "multipart/form-data; boundary=" + postBody->boundary());

nam->post(req,postBody);

和信号/插槽初始化

this->nam = new QNetworkAccessManager(this);
connect(this->nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));

在服务器上,有一个错误会导致错误的HTML,但操作本身会被正确执行(如果调用一次)。由于POST响应中的HTML不正确,QNetworkAccessManager会重试其POST请求几次(通常在Wireshark中可以看到3或4)。在Qt中,仅在Wireshark的最后一次POST之后立即到达replyFinished一次。 NetworkReply包含“连接已关闭”错误。

问题在于,当连续几次执行发布操作时,它会在服务器上执行错误操作。因为我无法在服务器端访问,所以我在客户端寻找一个只调用一次POST方法的解决方案。是否有任何参数可以在QNetworkAccessManager中设置,只允许单个POST尝试?或者Qt中是否有可以替代使用的替代方案?

1 个答案:

答案 0 :(得分:0)

尝试连接QNetworkReply信号而不是QNetworkAccessManager:

QNetworkReply* l_reply = nam->post(req,postBody);
connect(l_reply, SIGNAL(finished()), this, SLOT(replyFinished()));
connect(l_reply, error(QNetworkReply::NetworkError)), this, SLOT(replyError(QNetworkReply::NetworkError)));  // good practice

然后,在插槽 replyFinished 中,您可以通过以下方式检索回复:

QNetworkReply* l_reply = qobject_cast<QNetworkReply*>(sender());
if(l_reply->error() == QNetworkReply::NoError)
   ....
else
   qDebug() << l_reply.readAll();  // assign this to a variable or it will be lost once you print it