Qt之高级网络操作(HTTP/FTP快速上手)

639 篇文章 241 订阅
订阅专栏

1、 HTTP 的消息结构

1、Request

(1)、请求行:Request 消息中的第一行,由请求方式、请求URL、HTTP协议及版本三部分组成

(2)、请求头:其中 Content-Type 指定了客户端发送的内容格式。例如:Content-Type: application/json,指客户端发送的内容格式为 Json

(3)、请求体:要发送的表单数据

2、Response

(1)、状态行:Response 消息中的第一行,由 HTTP 协议版本号、状态码、状态消息三部分组成。状态码用来告诉 HTTP 客户端,HTTP 服务器是否产生了预期的 Response。HTTP/1.1 中定义了 5 类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别:

A、1XX:提示信息 - 表示请求已被成功接收,继续处理

B、2XX:成功 - 表示请求已被成功接收、理解、接受

C、3XX:重定向 - 要完成请求必须进行更进一步的处理

D、4XX:客户端错误 - 请求有语法错误或请求无法实现

E、5XX:服务器端错误 - 服务器未能实现合法的请求

(2)、响应头:其中 Content-Type 指定了服务器返回的内容格式。例如:Content-Type: application/json,指服务器返回的内容格式为 Json

(3)、响应体:服务器返回的内容

 

2、支持的协议

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
qDebug() << manager->supportedSchemes();

输出结果

(“ftp”, “file”, “qrc”, “http”, “https”, “data”)

3、请求

// URL
QString baseUrl = "http://www.csdn.net/";

// 构造请求
QNetworkRequest request;
request.setUrl(QUrl(baseUrl));

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
// 发送请求
QNetworkReply *pReplay = manager->get(request);

// 开启一个局部的事件循环,等待响应结束,退出
QEventLoop eventLoop;
QObject::connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec();

// 获取响应信息
QByteArray bytes = pReplay->readAll();
qDebug() << bytes;

4、更加复杂的POST请求

(1)、传递一个QByteArray 给 data 参数

(2)、数据在发出请求时会自动编码为表单形式

// URL
QString baseUrl = "http://httpbin.org/post";
QUrl url(baseUrl);

// 表单数据
QByteArray dataArray;
dataArray.append("key1=value1&");
dataArray.append("key2=value2");

// 构造请求
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
request.setUrl(url);

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

// 发送请求
manager->post(request, dataArray);

 

5、可以使用 json 参数直接传递,然后它就会被自动编码

// URL
QString baseUrl = "http://httpbin.org/post";
QUrl url(baseUrl);

// Json数据
QJsonObject json;
json.insert("User", "Qter");
json.insert("Password", "123456");

QJsonDocument document;
document.setObject(json);
QByteArray dataArray = document.toJson(QJsonDocument::Compact);

// 构造请求
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setUrl(url);

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

// 连接信号槽
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));

// 发送请求
manager->post(request, dataArray);

6、定制请求头

(1)如果你想为请求添加 HTTP 头部,只要简单地调用 setHeader() 就可以了。

(2)如发送的请求时,使用的 User-Agent 是 Mozilla/5.0 , 为了方便以后追踪版本信息,可以将软件的版本信息写入到 User-Agent 中

(3)、除了 User-Agent 之外,QNetworkRequest::KnownHeaders 还包含其他请求头,它就是为 HTTP 头部而生的。根据 RFC 2616, HTTP 头部是大小写不敏感。

(4)、如果 QNetworkRequest::KnownHeaders 不满足需要,使用 setRawHeader()

QNetworkRequest request;
request.setHeader(QNetworkRequest::UserAgentHeader, "my-app/0.0.1");

User-Agent:包含发出请求的用户信息。

 

7、响应内容

1、响应内容

(1)、要获取响应的内容,可以调用 readAll(),由于上述的 POST 请求返回的数据为 Json 格式,将响应结果先转化为 Json,然后再对其解析

(2)、响应的内容可以是 HTML 页面,也可以是字符串、Json、XML等。最上面所发送的 GET 请求 获取的就是 CSDN 的首页 HTML

void replyFinished(QNetworkReply *reply)
{
    // 获取响应信息
    QByteArray bytes = reply->readAll();

    QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
    if (jsonError.error != QJsonParseError::NoError) {
        qDebug() << QStringLiteral("解析Json失败");
        return;
    }

    // 解析Json
    if (doucment.isObject()) {
        QJsonObject obj = doucment.object();
        QJsonValue value;
        if (obj.contains("data")) {
            value = obj.take("data");
            if (value.isString()) {
                QString data = value.toString();
                qDebug() << data;
            }
        }
    }
}

2、响应状态码

(1)、HTTP 状态码请参考:

  • Status codes
  • List of HTTP status codes

(2)、最常见的是 200 OK,表示请求已成功,请求所希望的响应头或数据体将随此响应返回

QVariant variant = pReplay->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (variant.isValid())
    qDebug() << variant.toInt();
// 200    

3、响应头

进入 Response Headers:

 

QVariant variant = pReplay->header(QNetworkRequest::ContentTypeHeader);
if (variant.isValid())
    qDebug() << variant.toString();
// "text/html; charset=utf-8"

4、错误

QNetworkReply::NetworkError error = pReplay->error();
switch (error) {
case QNetworkReply::ConnectionRefusedError:
    qDebug() << QStringLiteral("远程服务器拒绝连接");
    break;
case QNetworkReply::HostNotFoundError:
    qDebug() << QStringLiteral("远程主机名未找到(无效主机名)");
    break;
case QNetworkReply::TooManyRedirectsError:
    qDebug() << QStringLiteral("请求超过了设定的最大重定向次数");
    break;
deafult:
    qDebug() << QStringLiteral("未知错误");
}
// "远程主机名未找到(无效主机名)"

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

QtFTP实现-QFtp实例操作
hw5230的博客
03-20 1315
今天具体来根据QFtp写个实例介绍如何在实际项目中使用其相关接口。主要为了演示接口使用,所以做了个简单的UI,没那么精致,凑合着看。
ffmpeg内存读取数据推流rtmp
zottffssent123的博客
09-28 3018
参考博客: 最简单的基于FFmpeg的内存读写的例子:内存播放器 最简单的基于FFmpeg的推流器(以推送RTMP为例) 记录RTSP通过FFmpeg+nginx发布成rtmp和http-flv 一个线程将网络实时流写入缓冲区,一个线程负责读取转封装成flv格式进行推流 有用到qt库,ffmpeg库版本4.2.1 pushstream.h #ifndef PUSHSTREAM_H #define PUSHSTREAM_H #include <QObject> #include
QT网络编程之Http
热土程序园,利他愉己~
03-20 1326
QT中的HTTP类 在Qt中,用于进行HTTP通信的类是QNetworkAccessManager类和相关的类。QNetworkAccessManager提供了一个用于发送网络请求和接收网络响应的高层API,它基于Qt网络模块实现。
Qt扫盲-网络编程概述
洪源兄
01-23 4055
Qt Network模块提供了允许我们编写TCP/IP客户端和服务器的类。它提供了低级类来完成基础的数据传输,如QTcpSocket、QTcpServer和QUdpSocket,Qt也提供了高级类,主要其实就是一个通用应用层协议的工具类,如QNetworkRequest、QNetworkReply和QNetworkAccessManager,这些类是使用公共协议执行网络操作
C++ QT FTP基操
Hello___Sunshine的专栏
06-05 1306
以上就是C++ QT实现FTP上传和下载的基本步骤。需要注意的是,FTP上传和下载需要有相应的权限,需要在FTP服务器上设置相应的用户和密码。同时,上传和下载的文件大小也受到FTP服务器的限制。FTP是一种文件传输协议,可以通过网络将文件从一个计算机传输到另一个计算机。在C++ QT中,可以使用QNetworkAccessManager类来实现FTP上传和下载。1. 创建QNetworkAccessManager对象。6. 设置上传文件的Content-Type。8. 将下载的数据写入本地文件。
Qt之QNetworkAccessManager 实现FTP文件上传/下载功能
06-06
Qt5移除了QFtp API,原因是其实现质量,QNetworkAccessManager 可以用来提供 ftp url 的上传下载操作; 但是美中不足的是QNetworkAccessManager没有提供list()、cd()、remove()、mkdir()、rmdir()、rename() 和 ...
QT5.0实现FTP服务器
06-22
qt5.0实现FTP服务器,源码已验证,可直接下载下来使用。
基于Qt开发的轻量级HTTP/HTTPS服务器
07-14
这是一个基于Qt开发的轻量级HTTP/HTTPS服务器 底层有QTcpSocket、QSslSocket两个版本,分别对应HTTP和...使用本库,推荐 Qt5.8.0 或者更高版本,以及支持 C++11 的编译器(例如VS2013或者更高),对操作系统无要求。
Qt通过TCP/UDP实现网络通信
最新发布
04-04
Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信Qt通过TCP/UDP实现网络通信...
QT网络功能实现Socket,HTTP,FTP(官方源代码)
11-03
QT网络功能实现Socket,HTTP,FTP
使用QT实现文件上传和下载----ftp服务器
07-16
使用QT实现文件上传和下载,服务器为FTP服务器,这是一个简单的测试源码。希望能够给初学者一定的启发。
使用QT实现的ftp客户端工具,QT版本:5.6
11-17
使用QT实现的ftp客户端工具,含界面。ftp服务器参数可配置,软件界面显示当前ftp服务器路径下的文件,可以上传本地文件到ftp,可以下载ftp远端文件到本地,是学习QTFTP很好的入门资料
FTP文件传输
05-08
自定义FTP服务多个客户端同时下载方式;或者排队请求下载方式的服务器和客户端 同步TCP分发给多路客户端的为同一个数据包服务,也即服务器接受多路不同客户端同一个包请求; 异步TCP,UDP分发给多路客户端的不是同一个数据包服务,即多路客户时排队请求接收服务。 附有服务端UDP无序同步的结构文件
qt 实现ftp服务器源码
03-09
不是客户端!不是客户端!不是客户端!不是客户端!不是客户端!
QT5 实现FTP 上传目录及目录文件方案
runwen_157的专栏
02-27 1244
QT5 实现FTP 上传目录及目录文件方案
[Qt教程] 第34篇 网络(四)FTP(二)
C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师---欢迎大家一起交流(私信添加博主微信)
11-12 2013
[Qt教程] 第34篇 网络(四)FTP(二) 楼主  发表于 2013-9-4 15:04:38 | 查看: 315| 回复: 9 FTP(二) 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语 前面讲述了一个最简单的FTP客户端程序的编写,
Qthttp通讯
qq_37033647的博客
09-06 1084
qt利用http和百度翻译api制作翻译软件
Qt文档阅读笔记-QNetworkAccessManager官方解析与实例
IT1995的博客
01-31 6161
目录   官方解析 博主例子   官方解析 QNetworkAccessMangager类运行应用程序回复和接收网络包。 QNetworkAccessManager是一套API库,可以发包,设置代理,内存配置等。可以用于网络的应答(如http协议)。 如下面这个伪代码的栗子: QNetworkAccessManager *manager = new QNetworkAcce...
Qt系列文章之FTP补充( 实现FTP通信概述及程序实现)
波风水门
03-30 549
文章目录前言基于QNetworkAccessManager的FTP头文件代码源代码建议 前言 前面写了tcp, udp通讯,唯独将ftp给漏掉了, 在Qt5之前也就是qt4是有QFTP这个类可以直接使用的,但是在Qt5以后,这个类就被官方给删除了,所以后面采用Ftp都是基于QNetworkAccessManager访问的,使用这个类不能设置ftp独有的命令来操作,所以我自己基于QTcpSocket开发了一套基于多线程的Ftp断点续传下载上传功能,可以创建目录,切换路径,实现各种复杂的ftp命令交互,已经上传
Qt之QuaZIP(zip压缩/解压缩)
06-09
QuaZIP是一个基于Qt的C++库,它可以用于Zip文件的压缩和解压缩操作。它可以方便地集成到您的Qt项目中,并提供简单易用的API使得您可以轻松地进行Zip文件的操作。QuaZIP支持标准Zip文件格式和64位Zip文件格式,并且...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 流媒体服务器之 ZLMediaKit介绍 22520
  • 使用VLC轻松体验本地视频推流、拉流、播放功能 19316
  • FFmpeg 代码实现流媒体推流(RTSP) 16619
  • 三种方法使用FFmpeg截取视频片断 15396
  • flv.js解析与使用 15102

分类专栏

  • C++Linux后端 158篇
  • 音视频开发进阶 722篇
  • Qt开发 639篇

最新评论

  • 使用VLC轻松体验本地视频推流、拉流、播放功能

    怀念小时候725: 没法播放 您的输入无法被打开: VLC 无法打开 MRL「rtsp://127.0.0.1:8554/rtsp001」。详情请检查日志。 您的输入无法被打开: VLC 无法打开 MRL「rtsp://127.0.0.1:8554/rtsp001」。详情请检查日志。 您的输入无法被打开: VLC 无法打开 MRL「rtsp://127.0.0.1:8554/rtsp2」。详情请检查日志。 您的输入无法被打开: VLC 无法打开 MRL「rtsp://127.0.0.1:8554/rtsp3」。详情请检查日志。 删了吧

  • 国内市场主流音视频产品的区别与对比分析

    A_678678: 很多数据都不准

  • 彻底理解 IO 多路复用!

    原来是笑傲菌殿下: 讲的很通俗易懂,太好了!

  • C++QT开发——GraphicsView(图形视图)

    weixin_44093513: 大佬的文章比我找的书写的还详细些,感谢感谢表情包

  • I/O多路复用详解

    weixin_42846878: select调用,应用进程是什么状态,还是像同步阻塞IO去轮询吗,没有讲清楚

大家在看

  • 【含论文】基于Springboot的图书管理系统/图书馆管理系统 508
  • HBase架构与基础命令
  • 八 、VS的调试技巧
  • 【QT5】<总结> QT主要技术点 157
  • 了解AIGC:让AI创造内容,改变未来 956

最新文章

  • 从零实现KV存储项目实战
  • KVBase分布式存储设计与实现
  • C++17新特性之std::void_t
2024
06月 4篇
05月 6篇
04月 11篇
03月 24篇
02月 9篇
01月 17篇
2023年569篇
2022年841篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司厦门网站推广系统推荐襄阳建设网站推荐迁安网站优化推荐黑河网站制作公司普洱建站价格哈尔滨百度关键词包年推广荆门百度标王丽江建设网站价格酒泉seo排名襄樊建网站哪家好汉中网站seo优化报价廊坊SEO按效果付费报价如何制作网站哪家好保定网站优化按天扣费哪家好塘坑外贸网站制作价格海西推广网站公司榆林网络推广推荐甘南SEO按天收费多少钱贵港建网站公司遂宁网站搭建哪家好庆阳设计公司网站三明seo网站推广推荐和田网站优化排名公司邢台seo网站优化报价金昌seo优化哪家好银川网站制作和田关键词排名多少钱玉溪百度竞价推荐北海网站推广方案公司玉林关键词按天扣费哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化