C ++ Qt - 仅在完成对最后一个的回复后才发送POST请求

时间:2013-03-14 12:54:41

标签: c++ qt post

我有一个桌面应用程序,使用POST请求将JSON字符串(某些设备信息)发送到Web服务,如果请求成功或存储信息时发生错误,Web服务将使用小JSON字符串作为指示符进行回复在数据库中。

当用户单击按钮并执行以下操作时,将发送此数据:

foreach(QString device, deviceList)
{
    QByteArray jsonString = device.toUtf8();
    currentRecord = device;

    // POST data size for "Content-Length" header
    QByteArray postDataSize = QByteArray::number(jsonString.size());

    // Build POST request
    QUrl serviceURL("http://www.mywebsite.com/awesomeWebService");
    QNetworkRequest request(serviceURL);
    request.setRawHeader("Content-Type", "application/json");
    request.setRawHeader("Content-Length", postDataSize);

    // Send POST request
    networkManager->post(request, jsonString);
}

当发送每个POST请求时,我在名为replyFinished()的槽中处理回复的finished()信号。我知道QNetworkAccessManager(在我的情况下是networkManger)是异步发送请求的,所以我认为理论上我可以在列表中收到第一个设备的回复,而不是第二个设备的回复。

如果所有信息都成功发送,我在replyFinished()方法中处理回复的顺序无关紧要,但是如果服务器端发生错误,我希望能够知道哪个设备字符串网络服务给了我一个错误。如果Web服务向我返回带有错误指示符的设备字符串,这可以实现,但是这没有实现,如果可能的话,我必须想办法在我这边做。这就是我把currentRecord = device;在foreach循环中,试图跟踪设备字符串(并在replyFinished()方法中使用它,但它似乎不起作用。

有没有办法在收到最后一个请求的回复后才能强制下一个POST请求发送?

我尝试使用这样的东西(while循环会在回复完成后中断),但应用程序冻结了:

QNetworkReply *reply;
while(!reply->isFinished())
{
    reply = networkManager->post(request, jsonString);
}

1 个答案:

答案 0 :(得分:3)

坐在while循环中会阻止Qt处理传入事件,这就是应用程序冻结的原因。相反,您应该发出一个请求,等待finished()信号,然后从replyFinished()位置发出队列中的下一个请求。重复,直到所有请求都完成。