分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

Qt发起Http/Https请求

发布时间:2023-09-06 02:34责任编辑:胡小海关键词:暂无标签

1. BurpSuite抓包

1.1 设置代理

burpsuite代理设置

浏览器代理设置(chrome),其他浏览器同理。

地址栏输入 chrome://settings/,

打开代理设置

设置代理端口

如果使用了代理插件,比如switchomega,可以这么设置

这样当选择使用代理选项的时候,请求包的数据也会被burpsuite拦截到。


1.2 导入证书

浏览器地址栏输入 http://burp/,如果有使用代理插件,建议先停用插件,待正确导入证书后开启使用,后续不再有影响。

点击CA Certificate,下载证书cacert.der

浏览器地址栏输入chrome://settings/

选择 “受信任的根证书颁发机构”,导入证书

下一步,选择证书,导入成功。

1.3 拦截抓包

浏览器地址栏输入地址访问,www.baidu.com

intercept is off 拦截已关闭

intercept is on 拦截已开启

可以看到请求包已经被我们拦截下来了。

选择放行Forward或者点击Intercept is on关闭拦截就会把数据包放行出去。

HTTP history中可以观察到已经拦截到的请求地址

如果有过滤的需求,可点击过滤

点击链接,会显示请求和响应等数据

下面自我发挥……


Qt发起http/https请求

1. 配置openssl

qt自身是不支持https的,如果想要使用https发起请求,要进行相关配置。

1.1 查看qt支持哪些协议

可以通过以下代码查看使用的qt版本支持哪些协议。

pro文件设置

添加network支持,QT += network

查看qt支持哪些协议

#include <QNetworkAccessManager>

#include <QDebug>

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

qDebug() << manager->supportedSchemes();

2 配置ssl
2.1 下载openssl
http://slproweb.com/products/Win32OpenSSL.html
选择版本,就选择这个版本了
2.2 下载后直接安装,然后加入到系统环境变量(我的安装目录是D:\OpenSSL-Win32\bin)
2.3 配置qt支持https
LIBS += -L"D:/OpenSSL-Win32/lib" -llibeay32 
LIBS += -L"D:/OpenSSL-Win32/lib" -lssleay32
INCLUDEPATH += $$quote(D:/OpenSSL-Win32/include)
可以测试ssl是否配置成功或者查看ssl的错误提示。
#include <QSslSocket>
qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString();
2.4 编写程序
这里不必要的业务逻辑就不在写了,主要放上https请求的代码,着重关注和http请求的不同点。

bool MainWindow::SendHttp()

{
 ???/*QNetworkAccessManager *manager = new QNetworkAccessManager(this);
 ???qDebug() << manager->supportedSchemes();*/

 ???qDebug() <<"ssl:" << QSslSocket::sslLibraryBuildVersionString();

 ???QNetworkRequest request;
 ???QSslConfiguration config;

 ???QNetworkProxy proxy;
 ???proxy.setType(QNetworkProxy::HttpProxy);
 ???proxy.setHostName("127.0.0.1");
 ???proxy.setPort(8080);
 ???QNetworkProxy::setApplicationProxy(proxy);

//url
request.setUrl(QUrl(strWww));

 ???QSslConfiguration conf = request.sslConfiguration();
 ???config.setPeerVerifyMode(QSslSocket::VerifyNone);
 ???config.setProtocol(QSsl::TlsV1_0);
 ???request.setSslConfiguration(config);

 ???//header
 ???auto it = m_headerMap.begin();
 ???while(it != m_headerMap.end())
 ???{
 ???????//qDebug() << it->second.m_skey.toLatin1() << it->second.m_sval.toLatin1() << ‘\n‘;
 ???????request.setRawHeader(it->second.m_skey.toLatin1(), it->second.m_sval.toLatin1());
 ???????++it;
 ???}

 ???//nam
 ???QNetworkAccessManager qnam;
qDebug() << qnam.supportedSchemes();

 ???// 开启一个局部的事件循环,等待响应结束,退出
 ???QEventLoop loop;
 ???QTimer timer;
 ???//发出请求
 ???QNetworkReply *reply = qnam.get(request);
 ???QObject::connect(&qnam,SIGNAL(finished(QNetworkReply *)),&loop,SLOT(quit()));
 ???//请求结束并下载完成后,退出子事件循环
 ???QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
 ???//超时退出
 ???QObject::connect(&timer,SIGNAL(timeout()),&loop,SLOT(quit()));
 ???//超时设置5秒钟
 ???timer.start(5000);
 ???//开启子事件循环
 ???loop.exec();
 ???//....

 ???if (reply->error() == QNetworkReply::NoError)
 ???{
 ???????QVariant statusCodeV =
 ???????????reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

 ??????if(statusCodeV.toInt() == 200
 ???????????????????????????????????/*这里写了这个readAll(),
 ????????????????????????????????????* 下面readAll()就取不出数据了
 ????????????????????????????????????* && !reply->readAll().isEmpty()
 ????????????????????????????????????*/
 ???????)
 ???????{

 ??????????//写入文件
 ??????????std::ofstream ofile;
 ??????????ofile.open("test.txt");
 ??????????if(ofile.fail())
 ??????????{
 ???????????????qDebug() << "error ofile" << ‘\n‘;
 ??????????}
 ??????????//reply->readAll().isEmpty()
 ??????????ofile << reply->readAll().toStdString();
 ??????????ofile.flush();
 ??????????ofile.close();
 ???????}
 ???}

return true;
}

Qt发起Http/Https请求

原文地址:https://www.cnblogs.com/HackerArt/p/10502478.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved