我已经实现了对我的应用程序的发布请求,如下所示:
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中是否有可以替代使用的替代方案?
答案 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