0

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)が非同期でリクエストを送信していることを知っているので、理論的には、リストの最初のデバイスの応答を2番目のデバイスの応答よりも遅く受信できると思います。

すべての情報が正常に送信された場合、replyFinished()メソッドで応答を処理する順序は関係ありませんが、サーバー側でエラーが発生した場合は、Webサービスがどのデバイス文字列であるかを知りたいです。エラーが発生しました。これは、Webサービスがエラーインジケーター付きのデバイス文字列を返した場合に実行できますが、これは実装されていないため、可能であれば自分の側でそれを行う方法を考え出す必要があります。これが、currentRecord=device;を配置する理由です。foreachループで、デバイス文字列を追跡しようとします(そして、replyFinished()メソッドで使用しますが、機能していないようです。

最後のリクエストへの返信を受け取った後にのみ、次のPOSTリクエストを強制的に送信する方法はありますか?

私はこのようなものを使おうとしましたが(応答が終了するとwhileループが壊れます)、アプリケーションがフリーズしました:

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

1 に答える 1

3

whileループに座っていると、Qtが着信イベントを処理できなくなります。そのため、アプリケーションがフリーズします。代わりに、1つの要求を行い、シグナルを待ってから、スロットfinished()からキュー内の次の要求を行う必要があります。replyFinished()すべてのリクエストが完了するまで繰り返します。

于 2013-03-14T13:57:56.297 に答える