基于QT实现发送http的get和post请求(post还可以实现上传文件),同时实现接收返回json数据,并对其进行解析

news2024/11/19 3:43:58

使用到中重要的类,做个简单的介绍

QNetworkAccessManager:这个类是QT帮我们封装好的工具类,主要可以用来发送Http请求
QNetworkReply:这个类主要用来监听发送的请求,并得到请求的响应结果
QHttpMultiPart:这个类主要用于封装post请求的二进制参数的数据
QEventLoop:这个类是一个控制事件
QJsonDocument:这个类用于解析JSON

头文件:

#ifndef HTTPTEST_H
#define HTTPTEST_H

#include <QObject>
#include <QDebug>
#include <QHttpMultiPart>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMetaObject>
#include <QEventLoop>
#include <QJsonDocument>            //以下是json数据传送所需头文件
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray>
#include <QFile>




class myHttp : public QObject
{
    Q_OBJECT

public:
    explicit myHttp(QObject *parent = nullptr);
    void sendGetRequest();
    void sendPostRequest();
    QString resultGet;
    QString resultPost;




public slots:
    void receiveReplyGet(QNetworkReply *reply);
    void receiveReplyPost(QNetworkReply *reply);


};



#endif // HTTPTEST_H

cpp文件

#include "myHttp.h"

myHttp::myHttp(QObject *parent) : QObject(parent)
{

}

void myHttp::sendGetRequest()
{

    qDebug()<<"get方法被执行";
    QNetworkRequest request1;
    QNetworkAccessManager nam;
    connect(&nam, &QNetworkAccessManager::finished, this, &myHttp::receiveReplyGet);

    //get与post的请求方式有所不同,get是在接口名后添加 ? 和传输的数据(type)
    request1.setUrl(QUrl("http://localhost:8080/dish/page?hello=666&name=hjl&age=18"));
    request1.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
    QString token = "xxxxxxxxxxxxxxxxxxxxxxxx";
    QString token_headerData = token;
    request1.setRawHeader("token",token_headerData.toLocal8Bit());
    QNetworkReply *reply = nam.get(request1);    //get请求头

    //开启事件循环,直到请求完成
    QEventLoop loop;
    connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
    loop.exec();

}

void myHttp::receiveReplyGet(QNetworkReply *reply)
{
    qDebug()<<"得到get方法的返回值";
    // 获取状态码
    int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    // 获取响应数据
    QString reply_data = reply->readAll();
    qDebug()<<reply_data<<status_code;
    resultGet=reply_data;


    //解析json字符串
    QJsonDocument jsonDoc = QJsonDocument::fromJson(reply_data.toUtf8());
    QJsonObject jsonObj = jsonDoc.object();

    QString date = jsonObj["date"].toString();
    int code = jsonObj["code"].toInt();
    QString msg = jsonObj["mes"].toString();

    qDebug()<<reply_data<<status_code<<date<<msg<<code;


}



void myHttp::sendPostRequest()
{
        qDebug()<<"post方法被执行";

        QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
        //封装文本参数
         QHttpPart textPart;
         textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=text"));
         textPart.setBody("text");


         //封装文件参数
         QHttpPart filePart;
         filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=file; filename=output.wav"));
         QString filename="F:\\output.wav";
         QFile file(filename);
         QByteArray bytes;

         if (!file.exists()) {
             qDebug() << "文件不存在";
             return;
         }

         if (file.open(QFile::ReadOnly)) {
             bytes = file.readAll();
              qDebug() << "状态:读取文件成功";
         }
         file.close();
         filePart.setBody(bytes);
         qDebug()<<bytes.size();


        //将封装到的参数加入到这个对象中
         multiPart->append(textPart);
         multiPart->append(filePart);



         QUrl url("http://localhost:8080/common/upload?age=18&hobby=football");
         QNetworkRequest request(url);
         request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("multipart/form-data; boundary="+multiPart->boundary()));

         QNetworkAccessManager manager;

         connect(&manager, &QNetworkAccessManager::finished, this, &myHttp::receiveReplyPost);
         QNetworkReply *reply = manager.post(request, multiPart);



        //开启事件循环,直到请求完成
        QEventLoop loop;
        connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
        loop.exec();


}

void myHttp::receiveReplyPost(QNetworkReply *reply)
{
        qDebug()<<"post方法返回";
        // 获取状态码
        int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        // 获取响应数据
        QString reply_data = reply->readAll();
        resultPost=reply_data;


        //解析json字符串
        QJsonDocument jsonDoc = QJsonDocument::fromJson(reply_data.toUtf8());
        QJsonObject jsonObj = jsonDoc.object();

        QString date = jsonObj["data"].toString();
        int code = jsonObj["code"].toInt();
        QString msg = jsonObj["msg"].toString();

        qDebug()<<reply_data<<status_code<<date<<msg<<code;

}




效果:

最后,如有不足欢迎指正,如有疑问,欢迎评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RSD处理气象卫星数据——常用投影

李国春 气象卫星扫描刈幅宽覆盖范围广&#xff0c;在地球的不同位置可能需要不同的投影以便更好地表示这些观测数据。这与高分辨率的局地数据有很大不同&#xff0c;高分数据更倾向于用使用处理局地小范围的投影方式。本文选择性介绍几种RSD常用的适合低、中、高纬和极地地区的…

python+nodejs+php+springboot+vue 校园安全车辆人员出入安全管理系统

本校园安全管理系统共包含15个表:分别是表现评分信息表&#xff0c;车辆登记信息表&#xff0c;配置文件信息表&#xff0c;家校互动信息表&#xff0c;监控系统信息表&#xff0c;教师信息表&#xff0c;留言板信息表&#xff0c;校园资讯信息表&#xff0c;人员登记信息表&am…

2023-9-23 合并果子

题目链接&#xff1a;合并果子 #include <iostream> #include <algorithm> #include <queue>using namespace std;int main() {int n;cin >> n;priority_queue<int, vector<int>, greater<int>> heap;for(int i 0; i < n; i){in…

Spring Cloud版本选择

SpringCloud版本号由来 SpringCloud的版本号是根据英国伦敦地铁站的名字进行命名的&#xff0c;由地铁站名称字母A-Z依次类推表示发布迭代版本。 SpringCloud和SpringBoot版本对应关系 注意事项&#xff1a; 其实SpringBoot与SpringCloud需要版本对应&#xff0c;否则可能会造…

墓园导航系统:实现数字化陵园祭扫新模式

墓园导航系统&#xff1a;实现数字化陵园祭扫新模式 随着人口老龄化趋势的加剧&#xff0c;人们对墓地的需求逐渐增加。同时&#xff0c;由于很多墓园面积较大&#xff0c;环境复杂&#xff0c;很多家属在寻找亲人墓地时感到不便和困难。此外&#xff0c;传统墓园的管理和服务水…

论文研读-数据共享-大数据流分析中的共享执行技术

Shared Execution Techniques for Business Data Analytics over Big Data Streams 大数据流分析中的共享执行技术 1、摘要 2020年的一篇共享工作的论文&#xff1a;商业数据分析需要处理大量数据流&#xff0c;并创建物化视图以便给用户实时提供分析结果。物化每个查询&#x…

FPGA——UART串口通信

文章目录 前言一、UART通信协议1.1 通信格式2.2 MSB或LSB2.3 奇偶校验位2.4 UART传输速率 二、UART通信回环2.1 系统架构设计2.2 fsm_key2.3 baud2.4 sel_seg2.5 fifo2.6 uart_rx2.7 uart_tx2.8 top_uart2.9 发送模块时序分析2.10 接收模块的时序分析2.11 FIFO控制模块时序分析…

java框架-Spring-事务

配置 配置事务管理器方法&#xff1a; Beanpublic PlatformTransactionManager platformTransactionManager(){return new DataSourceTransactionManager();}原理

多维时序 | MATLAB实现WOA-CNN-LSTM-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现WOA-CNN-LSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09; 目录 多维时序 | MATLAB实现WOA-CNN-LSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本描…

postman 自动升级后恢复collection数据

一、今天postman 自动升级了&#xff0c;导致一定要注册账号才能使用&#xff0c;登录账号后&#xff0c;发现之前的数据全部没有了。 找到目录&#xff1a;C:\Users\{{用户名}}\AppData\Roaming\Postman重新导入即可。 二、关闭自动更新&#xff1a;修改host&#xff0c;C:\W…

力扣-217.存在重复元素

Method 1 先对整个数组进行排序&#xff0c;然后从前往后开始遍历&#xff0c;判断前一个数 是否跟相邻的数相等 AC Code class Solution { public:bool containsDuplicate(vector<int>& nums) {sort(nums.begin(),nums.end());int front nums[0];for( int i 1; i…

Selenium自动化测试 —— 通过cookie绕过验证码的操作!

验证码的处理 对于web应用&#xff0c;很多地方比如登录、发帖都需要输入验证码&#xff0c;类型也多种多样&#xff1b;登录/核心操作过程中&#xff0c;系统会产生随机的验证码图片&#xff0c;进行验证才能进行后续操作 解决验证码的方法如下&#xff1a; 1、开发做个万能…

如何学习微服务Spring Cloud

简单来说&#xff0c;就是“三大功能&#xff0c;两大特性”。 三大功能是指微服务核心组件的功能维度&#xff0c;由浅入深层次递进&#xff1b;而两大特性是构建在每个服务组件之上的高可用性和高可扩展性。别看微服务框架组件多&#xff0c;其实你完全可以按照这三大功能模块…

外卖小程序开发指南:打造完美的点餐体验

第一步&#xff1a;项目设置和初始化 首先&#xff0c;您需要选择一个适合您的开发平台&#xff0c;例如微信小程序、支付宝小程序或其他移动应用平台。接下来&#xff0c;创建一个新的小程序项目&#xff0c;并初始化所需的文件和目录。 示例代码&#xff08;微信小程序&am…

项目进度网络图

概念 项目网络图是项目所有活动及其之间逻辑关系&#xff08;依赖关系&#xff09;的一个图解表示&#xff0c;并从左到右来表示项目的时间顺序。 可手工编制也可用计算机实现。可包括整个项目的全部细节&#xff0c;也可包含一个或多个概括性活动&#xff0c;还相应伴有一个…

向表中的指定列插入数据

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 练习:向test02表,所有列,插入数据 复习下前面的 mysql> #插入记录 mysql> insert into test02 values(1, 张三, 男, 100.5); Query OK, 1 ro…

【密码学补充知识】

&#x1f511;密码学&#x1f512;概述 &#x1f4d5; 1.基本概念 明文 &#xff1a; 要交换的信息 密文 &#xff1a; 明文经过一组规则变换成看似没有意义的随机消息。 加密 &#xff1a; 明文经过一组规则变换成密文的过程 解密 &#xff1a; 密文恢复出明文的过程 加…

【广州华锐互动】鱼卵孵化VR线上教学实训软件

随着科技的发展&#xff0c;教育方式也在不断地进行创新。VR研发公司广州华锐互动&#xff0c;为某院校开发了鱼卵孵化VR线上教学实训软件&#xff0c;可以帮助学生更好地理解鱼类繁殖和养殖的过程&#xff0c;还可以让他们在虚拟环境中进行实践操作&#xff0c;提高他们的技能…

HDFS编程实践-从HDFS中下载指定文件到本地

前言&#xff1a;Hadoop采用java语言开发&#xff0c;提供了Java Api与HDFS进行交互 先要把hadoop的jar包导入到idea中去 为了能编写一个与hdfs交互的java应用程序&#xff0c;一般需要向java工程中添加以下jar包 1&#xff09;/usr/local/hadoop/share/hadoop/common目录下…

Docker部署Nacos注册中心

文章目录 一、部署MySQL数据库并导入Nacos初始化SQL二、部署Nacos注册中心三、验证Nacos 一、部署MySQL数据库并导入Nacos初始化SQL 1、准备工作 docker pull mysql:8.0.27 Pwd"/data/software/mysql" mkdir ${Pwd}/{data,logs} -p chmod 777 ${Pwd}/logs2、添加配…