纪念第一篇文章

使用工具

  • Qt Creator 16.0.1 (Community)
  • Postman
  • vscode

具体逻辑

本次应用场景为qt向服务端发送json包装后的数据,用于登录
仅仅展示QT客户端发送和接受函数

代码

qt模块

1
QT += core gui network json

头文件

1
2
3
4
5
6
7
8
9
10
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QByteArray>
#include <QDebug>
#include <QMessageBox>

发送函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void login::ConnetLogin()
{
//url处理
QString apiurl = <api地址>;
qDebug()<<"Test API IP:"<<apiurl;

QNetworkRequest request{QUrl(apiurl)};
//设置post请求头
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

// 创建密钥
// 这里是我自定义的类crypto
crypto.setKeyPaths("pubkey.pem", "privkey.pem","aes.hex");
QString pubkey = crypto.generateKey();
qDebug() << "生成的公钥" <<pubkey;
//json数据
QJsonObject admin;
admin["admin"] = name;
admin["password"] = password;
admin["date"] = pubkey;
QByteArray data = QJsonDocument(admin).toJson();

// 发送 POST 请求
manager->post(request, data);
}

当你使用 QNetworkAccessManager 发送一个网络请求(如 GET 或 POST)时,它会返回一个 QNetworkReply*。你可以使用它来:

  • 检查请求是否成功(通过 error())

  • 读取返回的数据(通过 readAll())

  • 监听信号(如 finished(), readyRead(), errorOccurred() 等)

在接受到数据返回信号后,对服务器返回的json中的关键字进行提取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//接收登陆后服务端信息
void login::ReturnLogin(QNetworkReply* reply)
{
if (reply->error() == QNetworkReply::NoError) {
QByteArray response_data = reply->readAll();
QJsonParseError jsonError;
QJsonDocument doc = QJsonDocument::fromJson(response_data, &jsonError);

if (jsonError.error == QJsonParseError::NoError && doc.isObject()) {
QJsonObject obj = doc.object();
qDebug() << "Received JSON:" << obj;
ClearIni("status");
// 示例:读取某个字段
if (obj.contains("status")) {
QString status = obj["status"].toString();
qDebug() << "status:" << status;
if(status == "true"){
emit loginSuccess();
}
if(status == "false"){
QMessageBox::information(this, "提示", "验证失败", QMessageBox::Close);
}
}
// 这里是我自定义的类crypto
if (obj.contains("pubkey")) {
QString pubkey = obj["pubkey"].toString();
qDebug() << "pubkey:" << pubkey;
crypto.SavePubKey(pubkey);
}
if(obj.contains("aes_key")){
QString aes_key = obj["aes_key"].toString();
qDebug() << "aes_key:" << aes_key;
crypto.SaveAesKey(aes_key);
}

} else {
qDebug() << "JSON parse error:" << jsonError.errorString();
}
} else {
qDebug() << "Network error:" << reply->errorString();
}

reply->deleteLater();

}

网络接受信号连接到接受函数,避免堵塞ui进程

1
connect(manager, &QNetworkAccessManager::finished, this, &login::ReturnLogin);

用多线程方法也行