HTTP通信の基本構造
リクエストメッセージの構成
リクエスト行: メソッド、URI、HTTPバージョンで構成
ヘッダー: Content-Typeで送信データ形式を指定(例: application/json)
ボディ: 送信するデータ本体
レスポンスメッセージの構成
ステータス行: バージョン、ステータスコード、メッセージ
ステータスコード分類:
- 1xx: 情報 - リクエスト受信継続処理
- 2xx: 成功 - 正常処理完了
- 3xx: リダイレクト - 追加処理が必要
- 4xx: クライアントエラー - 不正なリクエスト
- 5xx: サーバーエラー - サーバー側の問題
レスポンスヘッダー: Content-Typeで応答データ形式を指定
レスポンスボディ: サーバーからの応答データ
対応プロトコルの確認
QNetworkAccessManager networkManager;
qDebug() << networkManager.supportedSchemes();
// 出力: ("ftp", "file", "qrc", "http", "https", "data")
HTTP GETリクエストの実装
QUrl targetUrl("http://example.com/api");
QNetworkRequest httpRequest(targetUrl);
QNetworkAccessManager* networkManager = new QNetworkAccessManager;
QNetworkReply* serverResponse = networkManager->get(httpRequest);
// 非同期応答待機
QEventLoop responseWaiter;
QObject::connect(networkManager, &QNetworkAccessManager::finished,
&responseWaiter, &QEventLoop::quit);
responseWaiter.exec();
// 応答データ取得
QByteArray responseData = serverResponse->readAll();
qDebug() << responseData;
POSTリクエストの送信
フォームデータ送信
QUrl apiEndpoint("http://httpbin.org/post");
QByteArray formData = "param1=value1¶m2=value2";
QNetworkRequest postRequest(apiEndpoint);
postRequest.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
QNetworkAccessManager* manager = new QNetworkAccessManager;
manager->post(postRequest, formData);
JSONデータ送信
QJsonObject jsonPayload;
jsonPayload["username"] = "QtUser";
jsonPayload["password"] = "secure123";
QJsonDocument jsonDoc(jsonPayload);
QByteArray jsonData = jsonDoc.toJson();
QNetworkRequest jsonRequest(QUrl("http://httpbin.org/post"));
jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkAccessManager* networkManager = new QNetworkAccessManager;
networkManager->post(jsonRequest, jsonData);
カスタムヘッダーの設定
QNetworkRequest customRequest;
customRequest.setHeader(QNetworkRequest::UserAgentHeader, "my-qt-app/1.0.0");
// 生ヘッダー設定
customRequest.setRawHeader("X-Custom-Header", "custom-value");
レスポンス処理
JSONレスポンスの解析
void handleResponse(QNetworkReply* response) {
QByteArray rawData = response->readAll();
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData, &parseError);
if (parseError.error == QJsonParseError::NoError && jsonDoc.isObject()) {
QJsonObject responseObj = jsonDoc.object();
QString result = responseObj.value("result").toString();
qDebug() << "処理結果:" << result;
}
}
ステータスコードの取得
QVariant statusCode = response->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (statusCode.isValid()) {
int code = statusCode.toInt();
qDebug() << "HTTPステータス:" << code;
}
エラーハンドリング
switch (response->error()) {
case QNetworkReply::ConnectionRefusedError:
qDebug() << "接続が拒否されました";
break;
case QNetworkReply::HostNotFoundError:
qDebug() << "ホストが見つかりません";
break;
default:
qDebug() << "ネットワークエラー発生";
}