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

Posted

技术标签:

【中文标题】C ++ Qt - 仅在最后一个回复完成后发送POST请求【英文标题】:C++ Qt - Sending POST request only after reply for the last one is finished 【发布时间】:2013-03-14 12:54:41 【问题描述】:

我有一个桌面应用程序,它使用 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);

【问题讨论】:

你真的应该看看 Qt Signals/Slots 机制,这是一个很棒的功能:)。您不必进行阻塞主应用程序的 while 循环。您可以通过信号和插槽进行所有操作。 【参考方案1】:

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

【讨论】:

我知道我必须这样做,但问题是如何在 foreach 循环中等待finished() 信号? 不要。可以使用QCoreApplication::processEvents(),但我真的建议您重组您的代码,这样就不需要了。 好的,我会尝试用事件(信号/槽)来做,并避免循环。

以上是关于C ++ Qt - 仅在最后一个回复完成后发送POST请求的主要内容,如果未能解决你的问题,请参考以下文章

最后一个请求完成后发送下一个请求

仅在用户启用时发送通知

QT 5.6.1 应用程序在退出插槽后仅在 x86 架构而不是 x64 上崩溃

C 套接字:Echo 服务器错误回复

Qt 和 C/C++ 之间的 IPC

如何从一个 QNetworkAccessManager 发送回复?