Qt发起Post请求进行登录并拿到token的值

发布时间 2024-01-03 11:06:53作者: 飘杨......

一、概述、

  编写一个登录界面,输入用户名及密码,点击登录按钮,调用登录接口发起网络请求。并拿到登录成功后的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.100.12:8384/aic-user/sso/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()
{

}