Qt应用软件【协议篇】http协议get、post示例
文章目录
- QT Http的API
- HTTP GET 请求示例
- HTTP POST 请求示例
- 伪装chrome浏览器get请求
QT Http的API
QNetworkAccessManager
- 作用:管理所有的网络请求,是发送请求和接收响应的中心点。
- 主要功能:
- 发送HTTP请求(GET, POST, PUT, DELETE等)。
- 处理网络请求的异步回调。
- 管理网络连接和重定向。
QNetworkRequest
- 作用:封装一个网络请求。
- 主要功能:
- 设置请求的URL。
- 添加或修改HTTP请求头(如User-Agent, Content-Type)。
- 配置请求的缓存策略和超时设置。
QNetworkReply
- 作用:接收并处理网络请求的响应。
- 主要功能:
- 读取响应内容(如HTML、JSON等)。
- 获取响应状态码(如200, 404等)。
- 处理网络错误和异常。
QUrl
-
作用:处理和操作URL。
-
主要功能:
-
解析和构建URL。
-
编码和解码URL组件。
-
检查URL的有效性。
-
QHttpMultiPart
- 作用:用于发送含有多部分内容的HTTP请求,例如文件上传。
- 主要功能:
- 创建多部分表单数据。
- 添加文本字段和文件上传。
- 设置每个部分的Content-Type。
QUrlQuery
- 作用:方便地构造和解析URL查询字符串。
- 主要功能:
- 添加、获取、删除查询参数。
- 将查询参数转换为编码后的字符串。
QSslConfiguration
- 作用:配置HTTPS请求的SSL参数。
- 主要功能:
- 设置SSL证书和密钥。
- 配置加密套件偏好。
- 管理SSL连接的安全性。
使用场景
- 简单的HTTP请求:使用
QNetworkAccessManager
和QNetworkRequest
发送GET、POST请求。 - 处理响应数据:通过
QNetworkReply
读取和处理返回的数据。 - 上传文件:通过
QHttpMultiPart
上传文件或提交表单。 - 安全通信:通过
QSslConfiguration
配置HTTPS请求的安全参数。
Qt的网络API设计为异步和事件驱动,适合开发现代的网络应用程序和服务。通过信号和槽机制,可以方便地处理网络请求的完成、错误和进度更新。
HTTP GET 请求示例
QT += network
这个例子展示了如何发送一个简单的HTTP GET请求并打印响应。
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
QUrl url("http://www.example.com");
QNetworkRequest request(url);
QNetworkReply* reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [reply]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray response = reply->readAll();
qDebug() << "Response:" << response;
} else {
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater();
});
return a.exec();
}
HTTP POST 请求示例
QT += network
这个例子展示了如何发送一个HTTP POST请求,该请求向服务器提交数据,并打印响应。
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QUrlQuery>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
QUrl url("http://www.example.com/post");
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
// 设置其他头部信息
request.setRawHeader("Accept-Language", "en-US,en;q=0.5");
QUrlQuery postData;
postData.addQueryItem("key", "value");
postData.addQueryItem("anotherKey", "anotherValue");
QNetworkReply* reply = manager.post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
QObject::connect(reply, &QNetworkReply::finished, [reply]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray response = reply->readAll();
qDebug() << "Response:" << response;
} else {
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater();
});
return a.exec();
}
伪装chrome浏览器get请求
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
// Chrome浏览器的用户代理字符串
QString userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36";
QUrl url("https://www.example.com");
QNetworkRequest request(url);
// 设置用户代理
request.setHeader(QNetworkRequest::UserAgentHeader, QVariant(userAgent));
// 设置其他典型的Chrome请求头部
request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
request.setRawHeader("Accept-Language", "en-US,en;q=0.9");
request.setRawHeader("Accept-Encoding", "gzip, deflate, br");
request.setRawHeader("Connection", "keep-alive");
// Chrome特有的请求头部,可能会随版本不同而变化
request.setRawHeader("Upgrade-Insecure-Requests", "1");
request.setRawHeader("Sec-Fetch-Site", "none");
request.setRawHeader("Sec-Fetch-Mode", "navigate");
request.setRawHeader("Sec-Fetch-User", "?1");
request.setRawHeader("Sec-Fetch-Dest", "document");
QNetworkReply* reply = manager.get(request);
QObject::connect(reply, &QNetworkReply::finished, [reply]() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray response = reply->readAll();
qDebug() << "Response:" << response;
} else {
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater();
});
return a.exec();
}