Как избежать нескольких запросов POST QNetworkAccessManager?
Я реализовал почтовый запрос для моего приложения, которое выглядит так:
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, но само действие выполняется правильно (если вызывается один раз). Из-за плохого HTML в ответе POST, QNetworkAccessManager повторяет свой запрос POST пару раз (обычно 3 или 4 можно увидеть в Wireshark). В Qt replyFinished достигается только один раз, сразу после последнего POST в Wireshark. NETworkReply содержит ошибку "Соединение закрыто".
Проблема здесь в том, что когда опубликованное действие выполняется несколько раз подряд, оно плохо работает на сервере. Поскольку у меня нет доступа на стороне сервера, я ищу решение на стороне клиента, которое вызовет метод POST только один раз. Есть ли какой-либо параметр, который можно установить в QNetworkAccessManager, который разрешит только одну попытку POST? Или в Qt есть альтернатива, которую можно использовать вместо?
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