纪念第一篇文章
使用工具
- 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() { QString apiurl = <api地址>; qDebug()<<"Test API IP:"<<apiurl;
QNetworkRequest request{QUrl(apiurl)}; request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
crypto.setKeyPaths("pubkey.pem", "privkey.pem","aes.hex"); QString pubkey = crypto.generateKey(); qDebug() << "生成的公钥" <<pubkey; QJsonObject admin; admin["admin"] = name; admin["password"] = password; admin["date"] = pubkey; QByteArray data = QJsonDocument(admin).toJson();
manager->post(request, data); }
|
当你使用 QNetworkAccessManager 发送一个网络请求(如 GET 或 POST)时,它会返回一个 QNetworkReply*。你可以使用它来:
在接受到数据返回信号后,对服务器返回的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); } } 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);
|
用多线程方法也行