「Qtの基礎 - ネットワーク」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == <br><br> == HTTPリクエスト / HTTPレスポンス == ==== 同期的に取得 1 ==== <code>QNetworkAccessManager</code>クラスを使用してGETリクエストを送信した後、レスポンスを同期的に待機する場合、<br> <code>QEventLoop</code>クラスを使用してレスポンスが完了するまでメインスレッドをブロックする。<br> HTTPレスポンスを受信した後、エラーチェックを行い、必要に…」) |
|||
2行目: | 2行目: | ||
<br><br> | <br><br> | ||
== HTTPリクエスト / HTTPレスポンス == | == HTTPリクエスト / HTTPレスポンス (同期的) == | ||
==== 同期的に取得 1 ==== | ==== 同期的に取得 1 ==== | ||
<code>QNetworkAccessManager</code>クラスを使用してGETリクエストを送信した後、レスポンスを同期的に待機する場合、<br> | <code>QNetworkAccessManager</code>クラスを使用してGETリクエストを送信した後、レスポンスを同期的に待機する場合、<br> | ||
52行目: | 52行目: | ||
if (reply->error() == QNetworkReply::NoError) { | if (reply->error() == QNetworkReply::NoError) { | ||
qDebug() << "Success!"; | qDebug() << "Success!"; | ||
qDebug() << "Response:" << reply->readAll(); | |||
} | |||
else { | |||
qDebug() << "Error:" << reply->errorString(); | |||
} | |||
reply->deleteLater(); | |||
</syntaxhighlight> | |||
<br> | |||
==== 同期的に取得 (タイムアウト設定あり) ==== | |||
<code>QNetworkReply</code>クラスのオブジェクトに対して、<code>QNetworkAccessManager</code>クラスの<code>setTimeout</code>メソッドを使用する。<br> | |||
<br> | |||
以下の例では、タイムアウトを3秒に設定しており、タイムアウト時には<code>QTimer</code>クラスを使用してタイムアウト処理を行っている。<br> | |||
<syntaxhighlight lang="c++"> | |||
#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(); | qDebug() << "Response:" << reply->readAll(); | ||
} | } |
2024年3月22日 (金) 15:11時点における版
概要
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();