Qt5写https client

Qt5写https client


这个是之前使用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 UPDATESOFTFUN_H
#define UPDATESOFTFUN_H

#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错误。

对于windows版本来说是这两个dll链接库:
ssleay32.dll
libeay32.dll

找到这两个库,然后将他们拷贝到QT的bin目录下(比如):“D:\Qt\Qt5.9.0\5.9\mingw53_32\bin”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值