1

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

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 中,replyFinished 仅在 Wireshark 中的最后一次 POST 之后立即到达一次。NetworkReply 包含“连接已关闭”错误。

这里的问题是,当发布的动作连续执行几次时,它会在服务器上做坏事。由于我没有服务器端的访问权限,我正在寻找一个客户端的解决方案,它只会调用一次 POST 方法。是否可以在 QNetworkAccessManager 中设置任何仅允许单个 POST 尝试的参数?或者 Qt 中有没有可以替代的替代品?

4

1 回答 1

1

Try connecting to the QNetworkReply signals instead of the 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

then, in the slot replyFinished you can retrieve the reply in this way:

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
于 2016-02-15T19:52:39.093 回答