ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Qt应用软件【协议篇】http协议get、post示例

2026/9/14 11:25:22 拓冰建站 浏览量
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请求:使用QNetworkAccessManagerQNetworkRequest发送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();
}