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();
同期的に取得 (タイムアウト設定あり)
QNetworkReply
クラスのオブジェクトに対して、QNetworkAccessManager
クラスのsetTimeout
メソッドを使用する。
以下の例では、タイムアウトを3秒に設定しており、タイムアウト時にはQTimer
クラスを使用してタイムアウト処理を行っている。
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QTimer>
QNetworkAccessManager manager;
// タイムアウトを3秒に設定
manager.setTransferTimeout(3000);
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://example.com")));
// タイムアウト用のタイマを設定
QTimer timeoutTimer;
timeoutTimer.setSingleShot(true);
QObject::connect(&timeoutTimer, &QTimer::timeout, [&](){reply->abort();});
timeoutTimer.start(3000); // タイムアウト時間を3秒に設定
// レスポンス待機
QEventLoop loop;
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
if (reply->error() == QNetworkReply::NoError) {
qDebug() << "Response:" << reply->readAll();
}
else {
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater();