Qt - 高级网络操作 HTTP/FTP

2023-10-27

欢迎转载,请注明出处:https://blog.csdn.net/qq_39453936?spm=1010.2135.3001.5343
原文链接: https://blog.csdn.net/qq_39453936/article/details/121401436

相关文章:
Qt - 网络编程
Qt - HTTP下载工具


HTTP协议概述

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

  • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
    以下图表展示了HTTP协议通信流程:
    cgiarch

请求消息Request

在这里插入图片描述
在这里插入图片描述

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

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

  • 请求体:要发送的表单数据。

响应消息Response

在这里插入图片描述
在这里插入图片描述

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

    1XX:提示信息 - 表示请求已被成功接收,继续处理。
    2XX:成功 - 表示请求已被成功接收、理解、接受。
    3XX:重定向 - 要完成请求必须进行更进一步的处理。
    4XX:客户端错误 - 请求有语法错误或请求无法实现。
    5XX:服务器端错误 - 服务器未能实现合法的请求。

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

  • 响应体:服务器返回的内容。

这里只对 HTTP 协议只做了一些简单的介绍:详细说明在这里插入图片描述

Qt Network

Qt Network 模块提供了大量的API用于网络操作。API为特定的操作和协议提供了一个抽象层(如通过HTTP收发数据)。并且仅公开一般或高级概念的类、函数和信号。

  • QNetworkRequest 网络请求:,充当与请求相关联的信息的通用容器,例如请求头信息、加密等。构造请求对象时指定的URL确定用于请求的协议。目前,支持HTTP、FTP和本地文件URL上传和下载。

  • QNetworkAccessManager操作管理:请求创建后,管理类会分发请求,然后对外发送信号标识请求进度。还可使用cookies在客户端存储数据、请求认证、代理使用。

  • QNetworkReply请求响应;该对象由QNetworkAccessManager在发送请求时创建。QNetworkReply提供的信号可以用于单独监控每个请求响应,或者开发人员可以选择使用管理器QNetworkAccessManager的信号来代替,并放弃对请求响应的引用。由于QNetworkReply是QIODevice的一个子类,因此响应可以被同步或异步的处理(阻塞或非阻塞)。

每个应用程序或库都可以创建一个或多个QNetworkAccessManager实例来处理网络通信。

支持协议

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

列出支持的所有 URL schemes:

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

请求头

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

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

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

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

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

响应状态码

QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (statusCode .isValid())
    qDebug() << variant.toInt();  

statusCode是HTTP服务器的相应码参考;最常见的是 200 OK,表示请求已成功,请求所希望的响应头或数据体将随此响应返回。

错误

如果请求的处理过程中遇到错误(如:DNS 查询失败、拒绝连接等)时,则会产生一个 QNetworkReply::NetworkError。错误定义参考

请求

  • get请求

    void getRequest()
    {
        QNetworkAccessManager *manager = new QNetworkAccessManager();
        //设置url
        QString url = "https://www.csdn.net/";
        QNetworkRequest request;
        request.setUrl(QUrl(url));
    
        //添加事件循环机制,请求过程为异步,返回后再执行后面的
        QEventLoop eventLoop;
        QNetworkReply *reply =  manager->get(request);
        connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
        eventLoop.exec();
        
        //错误处理
        if (reply->error() == QNetworkReply::NoError)
        {
            qDebug() << "success";
        }
        else
        {
            qDebug()<<"failure";
            QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
            qDebug( "request error code: %d %d\n", statusCode.toInt(), (int)reply->error());
            qDebug(qPrintable(reply->errorString()));
        }
    
        //请求返回的结果
        QByteArray responseByte = reply->readAll();
        qDebug() << responseByte;
  • post请求

    void postRequest()
    {
        QNetworkAccessManager *manager = new QNetworkAccessManager();
        //设置url
        QString url = "https://www.csdn.net/";
        QNetworkRequest request;
        request.setUrl(QUrl(url));
        
        request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    //  request.setRawHeader("Content-Type","application/json");//服务器要求的数据头部
    //  request.setRawHeader("Accept","text/json,*/*;q=0.5");//服务器要求的数据头部
    	
    	//添加事件循环机制,请求过程为异步,返回后再执行后面的
        QEventLoop eventLoop;
        //发送数据
        QByteArray qByteHttpData = JsonData();
        QNetworkReply *reply =  manager->post(requestInfo, qByteHttpData);	    
        connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
        eventLoop.exec();      
    
    	//错误处理
        if (reply->error() == QNetworkReply::NoError)
        {
            qDebug() << "success";
        }
        else
        {
            qDebug()<<"failure";
            QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
            qDebug( "request error code: %d %d\n", statusCode.toInt(), (int)reply->error());
            qDebug(qPrintable(reply->errorString()));
        }
    
        //请求收到的结果
        QByteArray responseByte = reply->readAll();
        qDebug() << responseByte;

    注意:开启事件循环时,界面不会响应用户操作(界面被阻塞)


参考文章:
https://blog.csdn.net/liang19890820/article/details/52535755/
https://www.runoob.com/http/http-methods.html


小白发文,欢迎指正
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt - 高级网络操作 HTTP/FTP 的相关文章

随机推荐

  • pytorch中的dropout

    为了防止过拟合 我们可以对网络实行dropout操作 有三种方法可以实现 torch nn functional dropout input p training self training 该种方法实现时必须标明training的状态为s
  • 测试学习13(正交表、测试用例力度、软件缺陷)

    正交表 从全面实验中挑选出有代表性的点进行测试 均匀分散 整齐可比 高效率 快速 经济的方法 正交排列法 正交实验设计 特点 均匀分散 齐整可比 正交表的概念 使用步骤 案例1 映射到选择好的正交表中 使用正交表的局限性 混合正交表 在实际
  • replaceAll、replace、replaceFirst(字符串多个元素替换)

    一 替换字符串中的多个字符 前言 Java中替换字符串可以用replace和replaceAll这两种 区别是 replace的参数是char和CharSequence 即可以支持字符的替换 也支持字符串的替换 CharSequence即字
  • flask_wtf中的参数介绍(StringField,PasswordField...)

    WTForms支持的HTML标准字段 字段类型 说 明 StringField 文本字段 TextAreaField 多行文本字段 PasswordField 密码文本字段 HiddenField 隐藏文本字段 DateField 文本字段
  • 【Java基础】IO流(二)

    个人简介 gt 个人主页 是Lay的主页 gt 学习方向 JAVA后端开发 gt 种一棵树最好的时间是十年前 其次是现在 gt 往期文章 Java基础 File类 IO流 gt 喜欢的话麻烦点点关注喔 你们的支持是我的最大动力 目录 1 字
  • Kali Linux网络攻击

    文章目录 一 Kali Linux 使主机和虚拟机IP处于同一网段 1 关机 点击edit 虚拟机 2 网络连接 选择桥接bridge模式 3 现在开机 就和主机在同一网段下 可以fping g查找其它的IP地址了 二 查看局域网下所有ip
  • SpringBoot自动配置原理

    说明 在阅读本篇文章之前建议大家先详细学习一下spring的相关知识 有助于更深刻的理解spirngboot的配置原理 目录 一 什么是springboot自动配置 二 Starter组件 三 三大注解 四 EnableAutoConfig
  • iOS开发:苹果开发者账号第一次新建APP ID以及创建App的步骤

    在iOS开发过程中 关于苹果开发者账号相关操作的知识点也是不可忽视的 尤其是对于一些刚接触苹果开发的开发者来说 更应该多了解一些关于苹果开发者账号的知识点 这样有利于App的测试和上架 苹果开发者账号相关知识大概分为两个部分 第一部分就是苹
  • Mysql进阶优化篇03——多表查询的优化

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 mysql基础 进阶 主要讲解mysql数据库sql刷题 进阶知识 包括索引 数据库调优 分库分表等 文章简介 本文将介绍多表查询的sql优化 绝
  • 并发线程 ( 3 ) - C++多线程并发同步【详解:条件变量/安全队列/future/promise/packaged_task/boost::thread_group等使用】

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 期待你的关注哦 有更多博文系列等着看哦 会经常更新 因为你的关注激励着我的创作 青春是薄脆的蛋壳 你总要打破它 去经
  • android简易下拉框架实现

    以前一直想写一个自己用的下拉插件 最近自己也看了很多的下拉插件 所以总结了一下 自己写了一个下拉刷新插件 实现的这个下拉刷新的框架 并不是自己的原创 在完成过程中是参考了很多开源的框架 并把自己认为比较好的东西借鉴了过来 从而形成我的东西
  • QGIS编译(跨平台编译)之十四:libzip编译(Windows、Linux、MacOS环境下编译)

    目录 1 libzip介绍 2 libzip下载 3 Windows下编译 4 Linux下编译 5 MacOS下编译 libzip依赖于openssl lzma zlib zstd等库 需要提前编译好 1 libzip介绍 libzip是
  • Elasticsearch DSL介绍

    ES支持一种JSON格式的查询 叫做DSL domain specific language 这门语言刚开始比较难理解 因此通过几个简单的例子开始 下面的命令 可以搜索全部的文档 query match all query定义了查询 mat
  • [网络安全提高篇] 一〇二.Metasploit技术之基础用法万字详解及防御机理

    当您阅读到该篇文章时 作者已经将 网络安全自学篇 设置成了收费专栏 首先说声抱歉 感谢这一年来大家的阅读和陪伴 这100篇安全文章记录了自己从菜鸡到菜鸟的成长史 该部分知识也花了很多精力去学习和总结 希望您能进步 一起加油喔 接下来我会接着
  • C++之sort()排序

    文章目录 一 头文件 二 使用sort 1 函数原型 2 简单地使用sort 1 默认排序 2 两种常用的排序方法 3 自定义使用sort 一 头文件 include
  • 关于电源管理和DCDC的使用的一个小坑

    这两天在使用电源管理IC 后面加一颗DCDC 在使用USB升级时 升级过程 在写FLASH时 出现升级失败的情况 是部分机器有 部分机器没有 于是让软件Debug一下 发现在写外部FLASH时出现死机情况 原因似乎是不清楚 后面我们尝试测量
  • JavaScript 经典「红宝书」,几代前端人的入门选择

    文末有活动 人的一生中总要读几本经典书 在这个 经典 泛滥的年代 什么才是权威的代表 我想大概是一本的书的口碑 能积累下上佳口碑的书 往往也是能经得住时间推敲的 比如这本 我相信所有前端开发者的案头都有这样一本书 这本书最早的版本第 2 版
  • 【数字调制】数字调制技术FSK与PSK分析与研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 上世纪 50 年代末 出现了 FSK 与二
  • 百度地图api获取位置信息,返回码为162,无法获取地址的问题【已解决】

    调用百度地图api返回码为162 无法获取地址的问题 已解决 下载百度地图提供的sdk代码包解压后将libs里面的文件全部复制到android 项目libs文件夹中 总之就是按照百度地图开发文档的介绍配置好环境 导包后要配置依赖 其实很简单
  • Qt - 高级网络操作 HTTP/FTP

    欢迎转载 请注明出处 https blog csdn net qq 39453936 spm 1010 2135 3001 5343 原文链接 https blog csdn net qq 39453936 article details