如何避免 QNetworkAccessManager 多个 POST 请求?
Posted
技术标签:
【中文标题】如何避免 QNetworkAccessManager 多个 POST 请求?【英文标题】:How to avoid QNetworkAccessManager multiple POST requests? 【发布时间】:2016-02-03 10:23:07 【问题描述】:我已经为我的应用程序实现了发布请求,如下所示:
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 中有什么替代品可以代替吗?
【问题讨论】:
QNetworkAccessManager
对响应中的“坏 html”一无所知。它所做的只是发送一个 HTTP 请求并接收一个响应。
【参考方案1】:
尝试连接到 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
【讨论】:
以上是关于如何避免 QNetworkAccessManager 多个 POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章