Как избежать нескольких запросов 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
Другие вопросы по тегам