Qt异步测试http/https网络链接
使用QNetworkRequest(需要在Qt项目中增加Network配置)来进行http/https的网络链接,
使用QFutureWatcher来监听异步测试结果,并在绑定的结果函数中处理用户功能。
不需要在监听结果中处理用户功能,可使用c++异步std::async处理。
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QtConcurrent/QtConcurrent>
#include <QtCore/QFutureWatcher>
#include <QtCore/QUrlQuery>
#include <QtCore/QTimer>
#include <QtWidgets/QApplication>
#include <future>
#include <iostream>
QFutureWatcher<bool> futureWatcher;
void DoDeleteLater(QNetworkReply* pReply)
{
if (Q_NULLPTR == pReply)
{
return;
}
if (pReply->isRunning())
{
pReply->abort();
}
pReply->deleteLater();
}
bool TestUrlLinks(const QString& strUrl, int nTimeOutmSec)
{
QUrl url = QUrl(strUrl);
if (!url.isValid())
{
return false;
}
QNetworkRequest request(url);
request.setRawHeader("Content-Type", "charset='utf-8'");
request.setRawHeader("Content-Type", "application/json");
if (0 == strUrl.indexOf("https://", 0, Qt::CaseInsensitive))
{
QSslConfiguration conf = request.sslConfiguration();
conf.setPeerVerifyMode(QSslSocket::VerifyNone);
conf.setProtocol(QSsl::TlsV1SslV3);
request.setSslConfiguration(conf);
}
auto pNetworkManager = QSharedPointer<QNetworkAccessManager>(new QNetworkAccessManager);
QEventLoop eventLoop;
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
timer.setSingleShot(true);
timer.start(nTimeOutmSec);
auto pReply = QSharedPointer<QNetworkReply>(pNetworkManager->get(request), DoDeleteLater);
QObject::connect(pReply.data(), &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
if (!timer.isActive())
{
return false;
}
timer.stop();
if (QNetworkReply::NoError != pReply->error())
{
return false;
}
QVariant var = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (!var.isValid())
{
return false;
}
int nHttpCode = var.toInt();
return nHttpCode == 200; // 200表示请求成功
}
void HandleWatcherFinished()
{
if (futureWatcher.result())
{
// 链接成功
qDebug() << "success";
}
else
{
qDebug() << "fail";
}
}
void Test(const QString& strUrl, int nTimeOutmSec)
{
//使用c++异步函数处理测试结果
//std::async(std::launch::async, [&strUrl]() {
//bool bRet = TestUrlLinks(strUrl, 3000);
//std::cout << (bRet ? "success" : "fail") << std::endl;});
//使用QFutureWatcher监听测试结果
QObject::connect(&futureWatcher, &QFutureWatcher<bool>::finished, &HandleWatcherFinished);
QFuture<bool> future = QtConcurrent::run<bool>(&TestUrlLinks, strUrl, nTimeOutmSec);
futureWatcher.setFuture(future);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Test("http://www.baidu.com", 3000);
return a.exec();
}
https连接测试失败处理
Qt5.12以前的版本:下载libeay32.dll 和 ssleay32.dll两个库文件,将这两个库文件拷贝到程序生成目录下
Qt5.12.5以后的版本: 下载libssl-1_1.dll 和 libcrypto-1_1.dll两个库文件,将这两个库文件拷贝到程序生成目录下

浙公网安备 33010602011771号