Qtの基礎 - ネットワーク

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2024年3月22日 (金) 14:45時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == HTTPリクエスト / HTTPレスポンス == ==== 同期的に取得 1 ==== <code>QNetworkAccessManager</code>クラスを使用してGETリクエストを送信した後、レスポンスを同期的に待機する場合、<br> <code>QEventLoop</code>クラスを使用してレスポンスが完了するまでメインスレッドをブロックする。<br> HTTPレスポンスを受信した後、エラーチェックを行い、必要に…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要



HTTPリクエスト / HTTPレスポンス

同期的に取得 1

QNetworkAccessManagerクラスを使用してGETリクエストを送信した後、レスポンスを同期的に待機する場合、
QEventLoopクラスを使用してレスポンスが完了するまでメインスレッドをブロックする。
HTTPレスポンスを受信した後、エラーチェックを行い、必要に応じてレスポンスを処理する。

ただし、同期的なHTTPリクエストはUIスレッドでブロックするため、長時間の処理や大量のリクエストの場合は非推奨である。
代わりに、非同期的なHTTPリクエストを使用することが推奨される。

 #include <QNetworkAccessManager>
 #include <QNetworkRequest>
 #include <QNetworkReply>
 
 QNetworkAccessManager manager;
 
 // 同期的なGETリクエスト
 QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("https://www.google.com")));
 
 // レスポンス待機
 QEventLoop loop;
 QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
 loop.exec();
 
 if (reply->error() == QNetworkReply::NoError) {
    qDebug() << "Success!";
    qDebug() << "Response:" << reply->readAll();
 }
 else {
    qDebug() << "Error:" << reply->errorString();
 }
 
 reply->deleteLater();


同期的に取得 2

非公式な方法ではあるが、QNetworkRequestクラスのSynchronousRequestAttributeアトリビューションを有効にすることで実現することもできる。

 #include <QNetworkAccessManager>
 #include <QNetworkRequest>
 #include <QNetworkReply>
 
 QNetworkAccessManager manager;
 QNetworkRequest request(QUrl(QStringLiteral("https://www.google.com")));
 request.setAttribute(QNetworkRequest::SynchronousRequestAttribute, true);
 
 // 同期的なGETリクエスト
 QNetworkReply *reply = manager.get(request);
 
 if (reply->error() == QNetworkReply::NoError) {
    qDebug() << "Success!";
    qDebug() << "Response:" << reply->readAll();
 }
 else {
    qDebug() << "Error:" << reply->errorString();
 }
 
 reply->deleteLater();