Почтовый метод из http-клиента в Qt5

У меня есть НЕБОЛЬШАЯ проблема, я сделаю клиентскую программу для подключения http-сервера в qt 5.1.0. Я отправляю петицию в файле json методом post, код основных методов, участвующих в их работе, следующий:

void HttpClient::sendJsonDocument(const QString typeId,const QString idClient)
{
QNetworkAccessManager *clientHttp=new QNetworkAccessManager();
clientHttp->clearAccessCache();
QUrl url("192.160.5.1:8383); //server adress
JsonManagment json;

QByteArray data;
data.clear();
data=("\r\n");
data.append(json.BuildJsonQuery(typeId,idClient));
data.append("\r\n");

QByteArray postDataSize = QByteArray::number(data.size());

QNetworkRequest request;
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("Content-Length",postDataSize);

SetHeaders(request, data);
QList <QByteArray> headers=request.rawHeaderList();
QList<QByteArray>::iterator i; 

QObject::connect(clientHttp,SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinish(QNetworkReply *)));
QNetworkReply *serverReplaying=clientHttp->post(request,data);  
QEventLoop eloop;
QObject::connect(serverReplaying,SIGNAL(finished()),  &eloop,  SLOT(quit()),Qt::UniqueConnection); 
eloop.exec( QEventLoop::ExcludeUserInputEvents );
}

Что ж, проблема в том, что когда моя программа выполняет сообщение, по-видимому, сообщение выполняется неправильно, потому что по сравнению с дополнением firefox, называемым poster, содержимое пакетов (и их количество различны), и иногда сервер отвечает правильно. , моя программа не может прочитать ответ и повторно отправить почтовую петицию даже 3 раза, и только получает сообщение об ошибке Закрытое соединение. Код моего слота answerFinished следующий:

void HttpClient::replyFinish(QNetworkReply *serverReplayingy)
{
 qDebug()<<"one step more";
 if(serverReplayingy->error() != QNetworkReply::NoError)
 {
   qDebug()<<"error:"<<serverReplayingy->errorString();
   QByteArray responseData = serverReplayingy->readAll();
 }

 else
 { 
   JsonManagment jsonFile;
   QByteArray responseData = serverReplayingy->readAll();
   jsonFile.CreateJsonFile(responseData);
   QString qstr(responseData);
   qDebug()<<qstr;
 }
 return;
 }

Я считаю, что сервер правильный (потому что он может ответить на дополняющий постер), и я скажу две детали: первая, когда я пытаюсь проверить, работает ли цикл событий, всегда дает ложь, а вторая, единственный способ, которым я могу получить только 1 передача и прием (1 петиция) были, когда я вырезал файл json, но я сразу получаю сообщение об ошибке с сервера.


person APRocha    schedule 08.10.2013    source источник


Ответы (1)


Будьте осторожны с жизненными циклами вашего объекта (то есть, если они уничтожены или живы). Если QNetworkAccessManager и/или HttpClient будут уничтожены во время сетевого запроса, ответ сервера исчезнет.

В вашем случае QNetworkAccessManager создается в методе, который отправляет запрос на сервер. Таким образом, если метод HttpClient::sendJsonDocument(); завершится до сетевого запроса (что, скорее всего, произойдет), QNetworkAccessManager будет уничтожен до получения ответа сервера, ответ исчезнет, ​​и ваш HttpClient не получит его. Лучший способ предотвратить это — поместить QNetworkAccessManager в глобальную переменную (или что-то в этом роде).

Кроме того, будьте осторожны с тем, как вы используете свой HTTPClient. Если вы используете его в таких методах или функциях:

void theFunction( /* the arguments*/ )
{
    // ...
    HttpClient client;
    // ...
    client.sendJsonDocument(typeID, clientID);
    // ...
}

HttpClient будет уничтожен в конце функции. Так же, как QNetworkAccessManager выше. Таким образом, если сетевой запрос не будет завершен до уничтожения HttpClient (что, вероятно, тоже произойдет), HttpClient будет уничтожен и не сможет получить ответ. Вам нужно будет найти способ сохранить HttpClient живым до тех пор, пока запрос не будет завершен и его ответ не будет обработан (в его слоте HttpClient::replyFinish(QNetworkReply *)). Будьте осторожны, если вы используете его в объектах, которые могут быть уничтожены до конца всего запроса. Все должно оставаться в живых, иначе ваш запрос исчезнет.

person air-dex    schedule 17.10.2013
comment
спасибо, я буду следовать вашим предложениям по дизайну, но сервер, наконец, был изменен, и системы начинают работать хорошо - person APRocha; 18.10.2013