HTTP通信とFTP転送のQt実装

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() << "ネットワークエラー発生";
}

タグ: Qt HTTP FTP QNetworkAccessManager JSON

7月2日 16:39 投稿