QT中网络编程之发送Http协议的Get和Post请求

文章目录

  • HTTP协议
  • GET请求
  • POST请求
  • QT中对HTTP协议的处理
    • 1.QNetworkAccessManager
    • 2.QNetworkRequest
    • 3.QNetworkReply
  • QT实现GET请求和POST请求
    • Get请求步骤
    • Post请求步骤
  • 测试结果

使用QT的开发产品最终作为一个客户端来使用,很大的一个功能就是要和后端服务器进行交互。
当前使用的QT版本如下:
在这里插入图片描述

HTTP协议

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而 消息内容则具有一个类似MIME的格式。
在这里插入图片描述

GET请求

GET 从指定的资源请求数据。必要时,可以将查询字符串参数追加到URL的末尾,以便将信息发送给服务器。GET因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内。

POST请求

POST向指定的资源提交要被处理的数据。POST请求应该把数据作为请求的主体提交,请求主体(body)可以包括非常多的数据,且数据格式不限。POST请求是没有的长度限制,请求数据是放在body中。

QT中对HTTP协议的处理

Qt中提供了QNetworkAccessManager、QNetworkRequest和QNetworkReply,用于应用程序对网络访问的处理。

1.QNetworkAccessManager

QNetworkAccessManager 提供了应用程序通过网络发送请求的能力。

2.QNetworkRequest

QNetworkRequest 保存通过网络发送请求所需的信息。 它包含一个 URL 和一些可用于修改请求的辅助信息。

3.QNetworkReply

QNetworkReply 类封装了使用 QNetworkAccessManager 发布的请求相关的回复信息。QNetworkReply 是 QIODevice的子类,这意味着一旦从对象中读取数据,它就不再由设备保留。因此,如果需要,应用程序有责任保留这些数据。

QT实现GET请求和POST请求

项目结构预览:
在这里插入图片描述
在这里插入图片描述
头文件httpoperate.h内容

#ifndef HTTPOPERATE_H
#define HTTPOPERATE_H

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>

class HttpOperate:public QObject
{
    Q_OBJECT
public:
    HttpOperate();
    void SendPostRequst();//用于发送Post请求的成员函数
    void SendGetRequst();//用于发生Get请求的成员函数

private:
    QNetworkAccessManager* mNetworkManager;
    QNetworkReply* mReply;

public slots: //类中做槽函数的成员函数一般写在public slots下,Qt5以及以上版本可以不写public slots
    void ReplyFinshed();
};

#endif // HTTPOPERATE_H

源文件httpoperate.cpp中的内容

#include "httpoperate.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QStringDecoder>
#include <QObject>
HttpOperate::HttpOperate() {}

void HttpOperate::SendGetRequst()
{
    mNetworkManager = new QNetworkAccessManager(this);
    QNetworkRequest _quest;
    QString url = "http://127.0.0.1:8083/v3/api/client/v1/captchaImage";
    url.append("?key1=小强&key2=xiao qing");
    _quest.setUrl((QUrl(url)));
    _quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
    mReply = mNetworkManager->get(_quest);
    QByteArray _data = mReply->readAll();//读出数据
    //QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData();
    qInfo()<<"1_data ==> "<<_data;
    //connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//方式一
    // auto lambdaFun = [=]{ReplyFinshed();};//lambda函数
    // connect(mReply,&QNetworkReply::finished,this,lambdaFun);
    connect(mReply,&QNetworkReply::finished,this,[=]{
        ReplyFinshed();
    });
    qInfo()<<"2_data ==> " << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData();
}

void HttpOperate::SendPostRequst()
{
    mNetworkManager = new QNetworkAccessManager(this);
    QNetworkRequest _quest;
    _quest.setUrl((QUrl("http://127.0.0.1:8083/v3/api/client/v1/createSignature")));
    // _quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
    _quest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
    QJsonDocument document;
    QJsonObject obj;
    obj.insert("key1", "小明");
    obj.insert("key2", "xiao hong");
    document.setObject(obj);
    QByteArray _postData = document.toJson(QJsonDocument::Compact);//以Json字符串的方式传参
    mReply = mNetworkManager->post(_quest,_postData);
    QByteArray _data = mReply->readAll();//读出数据
    qDebug()<<"1_data ==> "<<_data;//此s时数据为空
    //connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//方式一
    // auto lambdaFun = [=]{ReplyFinshed();};//lambda函数
    // connect(mReply,&QNetworkReply::finished,this,lambdaFun);//方式二
    connect(mReply,&QNetworkReply::finished,this,[=]{
        ReplyFinshed();
    });//方式三
    qDebug()<<"2_data ==> ";
}

void HttpOperate::ReplyFinshed()
{
    if (mReply->error() == QNetworkReply::NoError)
    {
        // 处理返回的数据
        QByteArray _data = mReply->readAll();//读出数据
        auto toUtf16 = QStringDecoder(QStringDecoder::Utf8);
        QString str = toUtf16(_data);
        qInfo()<<"_data ==> "<<str;
    } else {
        // 处理错误
        qDebug()<<"error ==> "<<mReply->error();
    }
    mReply->deleteLater();
}

main.cpp中的代码:

#include <QCoreApplication>
#include "httpoperate.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    HttpOperate hoper;
    hoper.SendPostRequst();//发起Post请求测试

    HttpOperate hoper1;
    hoper1.SendGetRequst();//发起Get请求测试
    return a.exec();//主程序会在这里阻塞
}

Get请求步骤

步骤:
1. 初始化QNetworkAccessManager对象。
2. 设置请求URL。
3. 连接消息返回。
4. 发送GET请求。
上面的关键代码就是:

/*内部发起http连接,连接成功后发起get请求.
  此接口是异步接口。请求发起后,会立即返回一个QNetworkReply类型对象的地址,
  此时打印它如上的1_data ==>结果为空字符串。
  当get请求响应返回后,会自动触发mReply所指对象的finished信号,此时mReply指对象里就有数据了,类似于Ajax的请求方式。
  然后调用响应的槽函数ReplyFinshed()处理读取数据的操作。
*/
mReply = mNetworkManager->post(_quest,_postData);
connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//将信号和槽函数进行关联,类似于绑定或注册的作用

Post请求步骤

初始化QNetworkAccessManager对象。
设置请求URL。
设置请求头Header
设置请求主体
连接消息返回。
发送POST请求。

/*内部发起http连接,连接成功后发起post请求.
  此接口是异步接口。请求发起后,会立即返回一个QNetworkReply类型对象的地址,
  此时打印它如上的1_data ==>结果为空字符串。
  当get请求响应返回后,会自动触发mReply所指对象的finished信号,此时mReply指对象里就有数据了,类似于Ajax的请求方式。
  然后调用响应的槽函数ReplyFinshed()处理读取数据的操作。
*/
mReply = mNetworkManager->get(_quest);
connect(mReply,&QNetworkReply::finished,this,&HttpOperate::ReplyFinshed);//将信号和槽函数进行关联,类似于绑定或注册的作用

测试结果

get请求测试后端服务使用的是springboot服务
后端接口为:
在这里插入图片描述
后端打印内容:
在这里插入图片描述
QT控制台输出内容:
在这里插入图片描述
post请求测试后端服务使用的也是springboot服务
后端接口为:
在这里插入图片描述
后端打印内容:
在这里插入图片描述
QT控制台输出内容:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频号小店怎么做?起店全流程实操分享!

我是电商珠珠 视频号小店距今也不过才发展了一年时间&#xff0c;22年发展的电商平台&#xff0c;经过各种优化到了23年在电商圈激起了不小的火花。 很多想要入驻的新手&#xff0c;在前期并不了解视频号小店怎么做的&#xff0c;不知道开店之后该如何运营。 接下来&#xf…

AutoJS 实现抖音极速版福袋脚本

前言 好久没更新博客了&#xff0c;最近做了个抖音极速版福袋脚本&#xff0c;想看看能不能自动抢到&#xff0c;于是在仿照其他脚本功能做了一个&#xff0c;哈哈。利用上班时间让它自己跑&#xff0c;测试大概2-3天&#xff0c;一个福袋没抢到(也不知道是不是被检测到了)&am…

Linux学习(1)——初识Linux

目录 一、Linux的哲学思想 1.1 基础知识 1.2 根目录下的文件夹 二、Shell 1、Shell的定义 2、Shell的作用 三、Linux命令行 1、Linux通用命令行使用格式 四、Linux命令的分类 1、内部命令和外部命令的理解 2、内部命令和外部命令的区别 3、命令的执行过程 五、编辑…

C语言——内存函数的使用与模拟实现

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…

手把手教你在 windows 上安装 Docker

前言 大家好&#xff0c;我是潇潇雨声&#xff0c;今天为大家带来一篇关于在 Windows 环境下使用 Docker 的教程。对于 Docker&#xff0c;我们可以简单地将其看作一种方便的软件安装方式&#xff0c;而无需深入涉及其复杂的概念。选择使用 Docker 主要是为了省事&#xff0c;比…

【python】在线代码混淆方案及注意事项

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 在线网站pyob混淆操作步骤编写测试代码混淆转pyc缺点中文路径问题&#xff1a;python: Cant reopen .pyc file 2️⃣ 反编译python文件格式对比uncompyle6 3️⃣ 其它方案cpythonpython-obfuscatorPyInstaller【不推荐】pyminifie…

数据结构与算法之美学习笔记:38 | 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

目录 前言如何理解分治算法&#xff1f;分治算法应用举例分析分治思想在海量数据处理中的应用解答开篇内容小结 前言 本节课程思维导图&#xff1a; MapReduce 是 Google 大数据处理的三驾马车之一&#xff0c;另外两个是 GFS&#xff08;hdfs&#xff09; 和 Bigtable(hbase)…

计算机提示vcruntime140.dll丢失的解决方法,多种修复教程分享

vcruntime140.dll是一个非常重要的动态链接库文件&#xff0c;它包含了许多运行时的函数和类。然而&#xff0c;有时候我们可能会遇到vcruntime140.dll无法继续执行代码的问题&#xff0c;这会给我们带来很大的困扰。那么&#xff0c;这个问题是什么原因导致的呢&#xff1f;又…

你知道跨站脚本攻击吗?一篇带你了解什么叫做XSS

1.XSS简介 &#xff08;1&#xff09;XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&#xff0c;本名应该缩写为CSS&#xff0c;但是由于CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式脚本&#x…

华清远见作业第十三天

1.使用多文件编辑&#xff0c; 定义商品信息:商品名称&#xff0c;商品单价&#xff0c;商品购买个数&#xff0c;商品描述&#xff0c;循环输入购买的商品&#xff0c;按单价排序&#xff0c;输出商品信息&#xff0c;计算最贵的商品以及一共花了多少钱? 在create函数&#x…

Python PyCaret:自动化机器学习的利器

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在这篇文章中&#xff0c;将深入介绍 Python 中强大的机器学习库 PyCaret。PyCaret 是一个自动化机器学习工具&#xff0c;旨在简化从数据预处理到模型部署的整个机器学习流程。通过 PyCaret&#xff0c;你可以以…

百度旋转验证码识别(最新)

最近研究了一下图像识别&#xff0c;一直找到很好的应用场景&#xff0c;今天我就发现可以用百度的旋转验证码来做一个实验。没想到效果还挺好&#xff0c;下面就是实际的识别效果。 1、效果演示 2、如何识别 2.1准备数据集 首先需要使用爬虫&#xff0c;对验证码图片进行采…

随时爆雷!2023年四大“安全债”

即将过去的2023年&#xff0c;网络安全、云安全、应用安全、数据安全领域暴露的诸多“安全债”中&#xff0c;有四大债务不但未能充分缓解&#xff0c;反而有在新的一年“爆雷”的风险。这四大债务分别是&#xff1a;Logj4漏洞、HTTP/2快速重置攻击漏洞、恶意电子邮件和后量子加…

《每天一分钟学习C语言·三》

1、 scanf的返回值由后面的参数决定scanf(“%d%d”,& a, &b); 如果a和b都被成功读入&#xff0c;那么scanf的返回值就是2如果只有a被成功读入&#xff0c;返回值为1如果a和b都未被成功读入&#xff0c;返回值为0 如果遇到错误或遇到end of file&#xff0c;返回值为EOF…

Ansible常用模块详解(附各模块应用实例和Ansible环境安装部署)

目录 一、ansible概述 1、简介 2、Ansible主要功能&#xff1a; 3、Ansible的另一个特点&#xff1a;所有模块都是幂等性 4、Ansible的优点&#xff1a; 5、Ansible的四大组件&#xff1a; 二、ansible环境部署&#xff1a; 1、环境&#xff1a; 2、安装ansible&#…

web前端游戏项目-雷霆战机飞机大战游戏【附源码】

文章目录 一&#xff1a;雷霆战机HTML源码&#xff1a;JS文件&#xff1a;&#xff08;1&#xff09;function.js&#xff08;2&#xff09;impact.js&#xff08;3&#xff09;move.1.1.js&#xff08;4&#xff09;script.js 二&#xff1a;飞机大战HTML源码&#xff1a;CSS源…

短视频时代,又恰逢双旦来临之际,普通人又该如何立足?

我是电商珠珠 在电商发展迅速的同时&#xff0c;短视频也在同步发展。国内的短视频比较热门的有抖音、视频号、快手这几个。 抖音在19年的时候发展起了自己的电商行业-抖音小店&#xff0c;并顺势掀起了直播电商的热潮。 直播电商在短视频中很火&#xff0c;所以很多人都选择…

电源模块测试方法 | 怎么测试电源负载瞬态响应?

负载瞬态响应测试是检测电源稳定性和质量的重要方法之一&#xff0c;而电源稳定性是设备正常运行的基础。通过负载瞬态响应测试来检测电源的响应速度和稳定性&#xff0c;从而优化电源设计&#xff0c;提升性能&#xff0c;确保电子设备可以稳定工作。 什么是负载瞬态响应测试?…

技术博客:市面上加密混淆软件的比较和推荐

引言 市面上有许多加密混淆软件可供开发者使用&#xff0c;但哪些软件是最好用的&#xff1f;哪些软件受到开发者的喜爱&#xff1f;本文将根据一次在CSDN上的投票结果&#xff0c;为大家介绍几款在程序员中普及度较高的加密软件。以下是投票结果&#xff0c;希望能对大家的选…

如何进一步优化Ubuntu服务器的性能

导读&#xff1a; 要进一步优化Ubuntu服务器的性能&#xff0c;您可以考虑以下几个方面&#xff1a;优化软件包管理&#xff1a; Ubuntu使用APT&#xff08;Advanced Package Tool&#xff09;作为其软件包管理工具。为了提高性能&#xff0c;您可以采取以下措施 要进一步优化U…