我有一个桌面应用程序,它使用POST请求向web服务发送JSON字符串(一些设备信息),如果请求成功或在数据库中存储信息时发生错误,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(在我的情况下networkmanager)是异步发送请求,所以我认为理论上我可以收到列表中第一个设备的回复,而不是第二个设备的回复。
如果所有信息都成功发送,那么我在replyFinished()方法中处理回复的顺序并不重要,但如果服务器端发生错误,我希望能够知道web服务给了我哪个设备字符串错误。如果web服务返回给我带有错误指示器的设备字符串,这可以完成,但这没有实现,如果可能的话,我必须找出一种方法来在我这边做到这一点。这就是为什么我把currentRecord = device;在foreach循环中,试图跟踪设备字符串(并在replyFinished()方法中使用它,但它似乎不起作用。
是否有任何方法可以强制下一个POST请求仅在我收到最后一个请求的回复后发送?
我尝试使用这样的东西(当回复完成时while循环会中断),但是应用程序冻结了:
QNetworkReply *reply;
while(!reply->isFinished())
{
reply = networkManager->post(request, jsonString);
}
在while循环中会阻止Qt处理传入的事件,这就是为什么你的应用程序会冻结。相反,您应该发出一个请求,等待finished()
信号,然后从replyFinished()
插槽发出队列中的下一个请求。重复,直到所有请求都完成。