当前位置: 首页 > article >正文

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();
}


http://www.kler.cn/a/227898.html

相关文章:

  • CF 761A.Dasha and Stairs(Java实现)
  • 消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)
  • Linux二进制部署K8s集群的平滑升级教程
  • Java面试题2025-设计模式
  • 一文讲解Java中的BIO、NIO、AIO之间的区别
  • Maui学习笔记- SQLite简单使用案例02添加详情页
  • 网络原理TCP/IP(1)
  • 【Unity知识点详解】自定义程序集
  • 大数据学习之Redis,十大数据类型的具体应用(四)
  • 判断和循环 - 循环语句 - for循环格式和练习
  • EtherCAT转ModbusTCP网关
  • 雨云游戏云VPS服务器用Linux搭建MCSM面板和Minecraft Mohist 1.20.2服务器教程,我的世界MOD和插件服开服教程。
  • 行为型设计模式—访问者模式
  • 自学Java的第十九天
  • 【数据分享】1929-2023年全球站点的逐日最低气温数据(Shp\Excel\免费获取)
  • C# CAD界面-自定义工具栏(三)
  • 树莓派5一键安装C++版本OpenCV
  • 【JavaEE进阶】 图书管理系统开发日记——伍
  • Flink与Redis集成:自定义连接器实现维表创建与数据汇入
  • 牛客网-------------------------长方体
  • Oracle出现超出打开游标最大数的解决方法
  • 中科大计网学习记录笔记(五):协议层次和服务模型
  • Redis的过期键的删除策略
  • Linux权限【超详细】
  • ubuntu22.04 VMware17.5
  • C++ STL库详解:容器适配器stack和queue的结构及功能