当前位置:Gxlcms > 数据库问题 > Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)

Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)

时间:2021-07-01 10:21:17 帮助过:2人阅读

HTTPS登录

进行SSL认证、设置传输的参数、设置消息头、开始请求、处理返回结果。

LoginNetworkManager::LoginNetworkManager(QObject *parent)
    : QNetworkAccessManager(parent)
{
    // SSL认证
    m_sslConfig = QSslConfiguration::defaultConfiguration();
    m_sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
    m_sslConfig.setProtocol(QSsl::TlsV1_2);

    connect(this, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
}

// 结束请求
LoginNetworkManager::~LoginNetworkManager()
{
    if (m_pReply != NULL)
    {
        m_pReply->abort();
        m_pReply->deleteLater();
    }
}

// 设置登录数据
void LoginNetworkManager::setParams(const QString &userName, const QString &password)
{
    m_strUserName = userName;
    m_strPassword = password;
}

void LoginNetworkManager::execute()
{
    QByteArray userNameByteArray = m_strUserName.toUtf8();
    QByteArray userNameEncoding = userNameByteArray.toPercentEncoding();

    // 设置发送的数据
    QByteArray dataArray;
    dataArray.append(QString("user_name=%1&").arg(QString(userNameEncoding)));
    dataArray.append(QString("password=%1&").arg(md5(m_strPassword)));
    dataArray.append("token_type=TOKEN");

    // 设置消息头
    QNetworkRequest request;
    request.setSslConfiguration(m_sslConfig);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
    request.setHeader(QNetworkRequest::ContentLengthHeader, dataArray.length());
    request.setUrl(QUrl(LOGIN_URL));

    // 开始请求
    m_pReply = post(request, dataArray);
}

// 响应结束
void LoginNetworkManager::replyFinished(QNetworkReply *reply)
{
    QByteArray bytes = reply->readAll();

    QString strUserID("");
    int nCode = -1;

    QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
    if (jsonError.error == QJsonParseError::NoError)
    {
        if (doucment.isObject())
        {
            QJsonObject object = doucment.object();
            if (object.contains("userId"))
            {
                QJsonValue userID = object.take("userId");
                if (userID.isString())
                {
                    strUserID = userID.toString();
                }
            }
            if (object.contains("code"))
            {
                QJsonValue codeValue = object.take("code");
                if (codeValue.isDouble())
                {
                    nCode = codeValue.toVariant().toInt();
                }
            }
        }
    }

    // 发送结果数据
    if (!strUserID.isEmpty())
    {
        emit onSuccess(strUserID);
    }
    else
    {
        emit onFail(nCode);
    }
}

使用方式

LoginNetworkManager *pLoginNetworkManager = new LoginNetworkManager(this);
connect(pLoginNetworkManager, SIGNAL(onSuccess(const QString &)), this, SLOT(onSuccess(const QString &)));
connect(pLoginNetworkManager, SIGNAL(onFail(int)), this, SLOT(onFail(int)));

// 设置参数
pLoginNetworkManager->setParams("test", "123456");
pLoginNetworkManager->execute();

结果处理

一般来说常用的返回格式为JSON、XML,当然也可以用特定格式的字符串,但大多数都是JSON较多。

得到结果后,我们就可以对返回的JSON进行解析,然后处理!

正确: 
“{“user_id”:”SELF-666666666_Qt-mr2Sj_9Iu92FWd-PqALbtwl6ZgtAFA”,”role”:1,”sex”:0,”user_name”:”test”,”create_date”:1449449966000}”

错误: 
{“msg”:”user_name=test and password is error.”,”code”:418,”error_msg”:”password is invalid”}

 

http://blog.csdn.net/liang19890820/article/details/50800712

Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)

标签:

人气教程排行