Qt 之 使用 https:// 发送 HTTP请求

一、简述

在使用Qt发送HTTP请求中一般使用的链接都是http://前缀,而有的服务器支持 https://前缀的链接,而Qt本身是支持https的,但是https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在Qt中使用https需要进行SSL认证。实现非常容易,简单几步即可完成。

二、HTTPS和HTTP的区别

1、简介

超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

2、区别

https协议需要到ca申请证书,一般免费证书很少,需要交费。

http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

三、如何进行SSL认证

1、首先,因为需要Openssl支持,使用SSL进行认证,所以需要对应的库文件 libeay32.dllssleay32.dll。需要下载libeay32.dllssleay32.dll两个库文件,将这两个库文件拷贝到程序生成目录下(即生成exe的同级目录)或者拷贝到QtNetwork模块的库文件目录中。
2、在发送HTTP请求之前加上如下代码
void onSendHttpsRequest(QString url)
{
	QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
	QNetworkRequest request;
	
	// 发送https请求前准备工作;
    QSslConfiguration config;
    QSslConfiguration conf = request.sslConfiguration();
    conf.setPeerVerifyMode(QSslSocket::VerifyNone);
    conf.setProtocol(QSsl::TlsV1SslV3);
    request.setSslConfiguration(conf);
    
	request.setUrl(QUrl(url));       // "https://www.temp.com"
	QNetworkReply *pReply = pManager->post(request, bytePost);

	connect(pReply , SIGNAL(finished()) , this , SLOT(onFinished());
	connect(pReply , SIGNAL(error(QNetworkReply::NetworkError)) , this , SLOT(onError(QNetworkReply::NetworkError)));
}

// 请求完成;
void onFinished()
{
	QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
	// 保存接受的数据;
	QByteArray replyContent = pReplay->readAll();
}

// 请求失败;
void onError(QNetworkReply::NetworkError errorCode)
{
	QNetworkReply *pReplay = qobject_cast<QNetworkReply*>(sender());
	// 输出错误码及错误信息;
	qDebug()<< errorCode;
	qDebug()<< pReplay->errorString();
}

关于两个库文件下载

1、在 http://slproweb.com/products/Win32OpenSSL.html 中下载 Win32 OpenSSL进行安装,将bin目录下面的库拷贝出来放到生成程序exe同级目录下即可。

2、 libeay32.dll 、 ssleay32.dll动态链接库 直接在我的资源中进行下载。

Qt中,你可以使用QNetworkAccessManager和相关的QNetworkRequest类来处理HTTP请求,包括POST方法。下面是一个简单的示例,展示如何定义一个URL接口并发送POST请求: ```cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QJsonDocument> class MyQTApp : public QObject { Q_OBJECT public slots: void sendData(const QString &data) { QNetworkAccessManager *manager = new QNetworkAccessManager(this); // 定义URL QUrl url(QStringLiteral("http://ip:port/123")); // 创建POST请求 QNetworkRequest request(url); request.setRawHeader("Content-Type", "application/json"); // 准备要发送的数据(这里假设是JSON格式) QByteArray jsonData = QJsonDocument::fromObject(QJsonObject::fromJsonString(data.toUtf8())).toBinaryData(); // 发送POST请求 connect(manager, &QNetworkAccessManager::finished, this, [manager, request, jsonData](const QNetworkReply *reply) { if (reply->error() == QNetworkReply::NoError) { qDebug() << "Post data successful: " << reply->readAll(); } else { qDebug() << "Error sending POST: " << reply->errorString(); } delete reply; }); manager->post(request, jsonData); } signals: void progressUpdate(int progress); // 如果需要进度更新信号,可以在此添加 private: QNetworkAccessManager *manager; // 网络访问管理器实例 }; int main(int argc, char **argv) { QCoreApplication a(argc, argv); MyQTApp app; app.sendData(R"({"key": "value"}")"); // 替换为你要发送的实际数据 return a.exec(); } ``` 在这个示例中,`sendData()`方法会创建一个指向指定IP地址和端口的URL,并设置请求头以表示POST方法。然后,它将准备的JSON数据作为POST体发送到服务器。当接收到响应时,会在控制台打印结果。 注意,这只是一个基本的示例,实际应用可能还需要处理更多的错误情况、添加请求头信息、处理超时等。此外,为了在发送大文件或长请求时显示进度,你可能需要添加一个`progressUpdate`信号,以及相应的槽函数来跟踪网络操作的进度。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值