banner
Alexeisie

AlexEisie

啊? Email: alexeisie@brs.red
github

Qt6/5 ネットワークプログラミング-HTTP GET/POSTリクエスト

開発プラットフォームは VS2022+Qt コンポーネントであり、QtCreator とは若干異なる可能性があります。

1. プロジェクトに Network ライブラリを設定する#

image
Qt のインストールディレクトリには、include フォルダと lib フォルダがあります。それぞれ QtNetwork フォルダと Qt6Network.lib(デバッグビルドの場合は Qt6Networkd.lib、Qt5 の場合は Qt5Network.lib)のフォルダが見つかります。
image
プロジェクトのプロパティで、C/C++--> 一般 --> 追加のインクルードディレクトリに以下の行を追加します。

$(QTDIR)\include\QtNetwork

image
プロジェクトのプロパティで、リンカー --> 入力 --> 追加の依存ファイルに以下の行を追加します。

$(QTDIR)\lib\Qt6Network.lib

リリースモードの場合も同様にヘッダーファイルとライブラリファイルを設定してください。

2. ヘッダーファイル#

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

QtNetwork は非同期ですので、各プロセスにはネットワークオブジェクトの管理に使用する QNetworkAccessManager オブジェクトが必要です。
QNetworkRequest を使用してリクエストを行います。
QNetworkReply を使用してレスポンスを取得します。

3. 関数の実装#

//QtNetwork.cpp
connect(ui.GETButton, SIGNAL(clicked()), this, SLOT(onGETButtonClicked()));

GETButton のクリックシグナルを onGETButtonClicked スロット関数にバインドすると仮定します。

//QtNetwork.hpp private slots:
void onGETButtonClicked() {
    QNetworkRequest request;
    QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
    connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));

    request.setUrl(QUrl("https://www.baidu.com"));
    QNetworkReply* reply = naManager->get(request);
}

まず、QNetworkAccessManager と QNetworkRequest オブジェクトを作成します。naManager は new を使用して作成してください(前述の通り、QNetwork は非同期であり、naManager が関数を終了すると自動的に破棄されます)。
次に、naManager の finished (QNetworkReply*) シグナルを requestFinished (QNetworkReply*) スロット関数にバインドします。
request の HTTP リクエスト URL を設定し、GET リクエストのレスポンスを取得するために reply オブジェクトを作成します。

void requestFinished(QNetworkReply* reply) {
	QString Result;
	// HTTPステータスコードを取得する
	QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
	if (statusCode.isValid())
		Result+=QString("ステータスコード=%1\n").arg(statusCode.toInt());

	QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
	if (reason.isValid())
		Result+=QString("理由=%1\n").arg(reason.toString());

	QNetworkReply::NetworkError err = reply->error();
	if (err != QNetworkReply::NoError) {
		Result+=QString("失敗:%1\n").arg(reply->errorString());
	}
	else {
		// レスポンスの内容を取得する
		Result+= reply->readAll();
	}
	ui.Result->setText(Result);
}

以前に reply オブジェクトを使用してレスポンスを取得しましたが、ここではレスポンスを解析します。

参考記事:https://blog.csdn.net/china_jeffery/article/details/83246355

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。