Qt发起Post请求进行登录并拿到token的值
一、概述、
编写一个登录界面,输入用户名及密码,点击登录按钮,调用登录接口发起网络请求。并拿到登录成功后的token值。如下图:
二、代码示例,主要内容都加了注释,不过多解释。这里没有封装直接在widget中发起网络请求及设置参数是为了更加方便的查看。方便学习,后面会把封装好的get和Post请求贴出来。
#include "NetworkWindow.h" NetworkWindow::NetworkWindow(QWidget* parent) : QWidget(parent) { this->setWindowTitle("登录"); etUserName = new EditText(this); etUserName->setPlaceholderText("请输入用户名"); etPassword = new EditText(this); etPassword->setPlaceholderText("请输入密码"); btnLogin = new Button(this); btnLogin->setText("登录"); QFormLayout* formLayout = new QFormLayout(this); formLayout->addRow(tr("用户名:"), etUserName); formLayout->addRow(tr("密 码:"), etPassword); formLayout->addRow(btnLogin); //formLayout->setMargin(50); formLayout->setVerticalSpacing(20); formLayout->setContentsMargins(50, 50, 50, 200); this->setLayout(formLayout); connect(btnLogin, &Button::clicked, [=]() { const QString username = etUserName->text(); const QString password = etPassword->text(); if (username.isEmpty()) { QMessageBox::warning(this, "温馨提示", "用户名不能为空"); } else if (password.isEmpty()) { QMessageBox::warning(this, "温馨提示", "用户密码不能为空"); } else { login(QString(username), QString(password)); } }); } void NetworkWindow::login(QString username, QString password) { //准备登录数据:用户名和密码,并存入JSONObject中 QJsonObject dataObj; dataObj.insert("username", username); dataObj.insert("password", password); //将数据存入json文档 QJsonDocument document; document.setObject(dataObj); //转换成QByteArray方便下面使用 QByteArray byteArray = document.toJson(QJsonDocument::Compact);//类型转换 //http请求 QNetworkRequest request;//用于设置请求参数,如:请求头、请求URL等 QNetworkAccessManager nam;//用于发起网络请求,如POST、GET connect(&nam, &QNetworkAccessManager::finished, this, &NetworkWindow::onResponse);//自定义槽函数用于接收网络请求完成后的数据 //设置网络请求的URL request.setUrl(QUrl("http://192.168.1.12:8080/xxxx/xx/login")); //请求头token设置 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=utf-8")); request.setRawHeader("Authorization", ""); request.setRawHeader("deviceType", "2"); request.setRawHeader("appVersion", "1.0.0"); request.setRawHeader("channel", "android"); request.setRawHeader("deviceCode", "8f6f465f-e91d-4a97-8f4e-e6a410e4f0e7_android_1702617469162"); request.setRawHeader("deviceName", "LNA-AL00"); qDebug() << "请求头:"; qDebug() << "请求内容:" << byteArray.toStdString().c_str(); qDebug() << "请求方式:Post"; QNetworkReply* reply = nam.post(request, byteArray); //post请求头+传输的数据 //开启事件循环,直到请求完成 QEventLoop loop; connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); } //曹函数,用于处理Http请求的响应结果 void NetworkWindow::onResponse(QNetworkReply* reply) { //获取Http请求响应状态码 QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if (statusCode.isValid()) { qDebug() << "Http请求状态码 = " << statusCode.toInt(); } //获取响应源语 QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); if (reason.isValid()) { qDebug() << "Http请求响应源语=" << reason.toString(); } //网络请求错误 QNetworkReply::NetworkError err = reply->error(); if (err == QNetworkReply::NoError) {//表示网络请求没有错误 QByteArray res = reply->readAll(); QJsonObject doc = QJsonDocument::fromJson(res).object(); QString ip = doc.value("ip").toString(); int code = doc.value("code").toInt(); QString message = doc.value("message").toString(); qDebug() << "IP地址:" << ip; qDebug() << "code:" << code; qDebug() << "message:" << message; if (code == 200) {//请求正常输出token的值,存储本地,然后表示登录成功 QJsonObject mData = doc.value("data").toObject(); QString token = mData.value("key").toString(); qDebug() << "token:" << token; QMessageBox::information(this, "信息", "token的值为" + token); } else { QMessageBox::critical(this, "错误", message); } //QString qDebug() << "输出网络请求的整体响应结果:" << res << endl; } else { qDebug() << "网络请求发生异常"; } //请求完成后释放reply对象 reply->deleteLater(); } NetworkWindow::~NetworkWindow() { }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2014-01-03 Java JDK1.5、1.6、1.7新特性整理