我有一个桌面应用程序,它使用 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 服务给了我一个错误。如果 Web 服务向我返回带有错误指示器的设备字符串,则可以完成此操作,但这没有实现,如果可能的话,我必须想办法在我这边完成它。这就是为什么我把 currentRecord = device;在 foreach 循环中,试图跟踪设备字符串(并在 replyFinished() 方法中使用它,但它似乎不起作用。
有什么方法可以强制仅在收到上一个请求的回复后才发送下一个 POST 请求?
我尝试使用类似这样的方法(回复完成时 while 循环会中断),但应用程序卡住了:
QNetworkReply *reply;
while(!reply->isFinished())
{
reply = networkManager->post(request, jsonString);
}
最佳答案
while 循环会阻止 Qt 处理传入的事件,这就是您的应用程序卡住的原因。相反,您应该发出一个请求,等待 finished()
信号,然后从您的 replyFinished()
插槽发出队列中的下一个请求。重复直到所有请求都完成。
关于C++ Qt - 只有在最后一个回复完成后才发送 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15409882/