天天看點

Qt5寫https client

Qt5寫https client

文章目錄

  • ​​Qt5寫https client​​
  • ​​一、源碼​​
  • ​​二、Qt5使用ssl的一些注意事項​​

這個是之前使用Qt5寫https用戶端的一個例子,用來和遠端https server進行md5校驗及下載下傳檔案等做OTA更新的一部分代碼,做一下記錄。

一、源碼

#include "updatesoftfun.h"
#include <QDebug>

UpdateSoftFun::UpdateSoftFun()
{
    this->manager = new QNetworkAccessManager(this);
}

UpdateSoftFun::~UpdateSoftFun()
{
    delete(this->manager);
}

void UpdateSoftFun::getMD5(QNetworkReply* res)
{
    QByteArray bytes = res->readAll();
    if(bytes.isNull())
    {
        qDebug()<< "getMd5 is NULL!";
        disconnect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getMD5(QNetworkReply*)));
        return;
    }
    qDebug() << "getMD5 ok" << bytes;

    QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
    if (jsonError.error != QJsonParseError::NoError)
    {
        qDebug() << QStringLiteral("解析Json失敗") << jsonError.error;
        disconnect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getMD5(QNetworkReply*)));
        return;
    }

    // 解析Json
    if (doucment.isObject())
    {
        QJsonObject obj = doucment.object();
        QJsonValue value;
        if (obj.contains("result"))
        {
            value = obj.take("result");
            if (value.isString())
            {
                QString data = value.toString();
                qDebug() << data;
                newMD5 = data;
            }
        }
    }

    disconnect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getMD5(QNetworkReply*)));
    res->deleteLater();
}

bool UpdateSoftFun::checkUpdate()
{
    //判斷系統是否支援OpenSSL
    if(false == QSslSocket::supportsSsl())
    {
        qDebug() << "不支援ssl";
        return false;
    }
    qDebug() << "支援ssl";

    //通過QSslConfiguration類進行SSL連接配接配置
    QSslConfiguration SSLConfig;
    SSLConfig = QSslConfiguration::defaultConfiguration();
    //設定SSL驗證模式(四種模式,目前隻能使用前兩種)
    SSLConfig.setPeerVerifyMode(QSslSocket::QueryPeer);
    //使用TLS 1.2協定版本 這得看你伺服器端的支援情況
    SSLConfig.setProtocol(QSsl::TlsV1_2);

    QNetworkRequest request;
    //改成你自己的URL
    request.setUrl(QUrl("https://xxxxxxxxxxxxxxxxx/getMD5"));

    //加入SSL配置資訊
    request.setSslConfiguration(SSLConfig);

    //發送GET請求
    manager->get(request);
    //連接配接請求結束信号
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getMD5(QNetworkReply*)));

    return true;
}      
#ifndef
#define

#include <QNetworkAccessManager>
#include <QFile>
#include <QSsl>
#include <QSslKey>
#include <QSslSocket>
#include <QSslConfiguration>
#include <QSslCertificate>
#include <QSslError>
#include <QUrl>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QtNetwork>

class UpdateSoftFun : public QObject
{
    Q_OBJECT

public:
    UpdateSoftFun();

    ~UpdateSoftFun();

    bool checkUpdate();

public slots:
    void getMD5(QNetworkReply *res);

private:
    QNetworkAccessManager *manager;  //網絡連結管理器

    QString newMD5;
};

#endif// UPDATESOFTFUN_H      

不要直接拿着就用,簡單了解一下注釋,看一下Qt幫助手冊,然後根據你的需要移植一下。

二、Qt5使用ssl的一些注意事項

QT5這裡有一個坑點,就是QT5對OpenSSL的程式設計實作了支援,但是卻沒有附帶對應的二進制運作庫(或者位置不對),這就會使得你的程式代碼編譯是正确通過的,但是在IDE裡頭運作調試時,會報SSL錯誤。