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”