Qtの基礎 - ネットワーク
ナビゲーションに移動
検索に移動
概要
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();