介绍

QtNetwork是Qt网络操作模块,提供了基于TCP/IP的各种API。

qt4x分别使用QFtp和QHttp,5以后统一用QNetworkAccessManager

HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序号

方法

描述

1

GET

请求指定的页面信息,并返回实体主体。

2

HEAD

类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

3

POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

4

PUT

从客户端向服务器传送的数据取代指定的文档的内容。

5

DELETE

请求服务器删除指定的页面。

6

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

7

OPTIONS

允许客户端查看服务器的性能。

8

TRACE

回显服务器收到的请求,主要用于测试或诊断。

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

QNetworkAccessManager接口介绍

接口很多,就不全部复制过来了,如果机器装着qt5,可以直接在助手看。

可以一目了然的看到几个熟悉词汇的api:post、get、put、head,当然还有几个cookie相关的方法。

 1 QNetworkReply *get(const QNetworkRequest &request)2 QNetworkReply *head(const QNetworkRequest &request)3 bool isStrictTransportSecurityEnabled() const4 bool isStrictTransportSecurityStoreEnabled() const5 NetworkAccessibility networkAccessible() const6 QNetworkReply *post(const QNetworkRequest &request, QIODevice *data)7 QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data)8 QNetworkReply *post(const QNetworkRequest &request, QHttpMultiPart *multiPart)9 QNetworkProxy proxy() const
10 QNetworkProxyFactory *proxyFactory() const
11 QNetworkReply *put(const QNetworkRequest &request, QIODevice *data)
12 QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data)
13 QNetworkReply *put(const QNetworkRequest &request, QHttpMultiPart *multiPart)

可以发现使用manager还需要几个类:QNetworkRequest 专门用于请求的,QNetworkReply 接收请求的响应

QNetworkRequest

1 void setAttribute(Attribute code, const QVariant &value)
2 void setHeader(KnownHeaders header, const QVariant &value)
3 void setMaximumRedirectsAllowed(int maxRedirectsAllowed)
4 void setOriginatingObject(QObject *object)
5 void setPriority(Priority priority)
6 void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)
7 void setSslConfiguration(const QSslConfiguration &config)
8 void setUrl(const QUrl &url)

主要就是这几个写方法,分别对一个请求的不同类进行配置。

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。请求行组成:请求方法+空格+url+空格+协议版本+回车符+换行符。

对于header,qt提供了一个枚举类型KnownHeaders分别表示不同项:

Constant

Value

Description

QNetworkRequest::ContentDispositionHeader

6

Corresponds to the HTTP Content-Disposition header and contains a string containing the disposition type (for instance, attachment) and a parameter (for instance, filename).

QNetworkRequest::ContentTypeHeader

0

Corresponds to the HTTP Content-Type header and contains a string containing the media (MIME) type and any auxiliary data (for instance, charset).

QNetworkRequest::ContentLengthHeader

1

Corresponds to the HTTP Content-Length header and contains the length in bytes of the data transmitted.

QNetworkRequest::LocationHeader

2

Corresponds to the HTTP Location header and contains a URL representing the actual location of the data, including the destination URL in case of redirections.

QNetworkRequest::LastModifiedHeader

3

Corresponds to the HTTP Last-Modified header and contains a QDateTime representing the last modification date of the contents.

QNetworkRequest::CookieHeader

4

Corresponds to the HTTP Cookie header and contains a QList<QNetworkCookie> representing the cookies to be sent back to the server.

QNetworkRequest::SetCookieHeader

5

Corresponds to the HTTP Set-Cookie header and contains a QList<QNetworkCookie> representing the cookies sent by the server to be stored locally.

QNetworkRequest::UserAgentHeader

7

The User-Agent header sent by HTTP clients.

QNetworkRequest::ServerHeader

8

The Server header received by HTTP clients.

请求类主要是进行对于地址,还给出了QUrl 类,详情见后。

QNetworkReply

此类继承自QIODevice,可使用QIODevice的所有接口,包括readall读取接收的所有信息。

同时此类提供了finished信号,在响应完斥候发出此信号,可关联自定义槽函数函数,做响应处理。

提供了attribute属性函数,可以判断响应的类型,比如RedirectionTargetAttribute是目标url告知进行重定向

QNetworkReply不会自动释放空间,一定要主动处理内存释放,可以调用QObject::deleteLater令其自动释放空间

范例

.h文件

 1 #ifndef MAINWINDOW_H2 #define MAINWINDOW_H3 4 #include <QMainWindow>5 #include <QtNetwork>6 #include <QFile>7 namespace Ui {8 class MainWindow;9 }
10
11 class MainWindow : public QMainWindow {
12     Q_OBJECT
13
14 public:
15     explicit MainWindow(QWidget *parent = 0);
16     ~MainWindow();
17     void Get(QUrl u);
18 private slots:
19     void on_pushButton_clicked();
20     void finished();
21 private:
22     Ui::MainWindow *ui;
23     QNetworkAccessManager manager;
24     QUrl url;
25     QNetworkReply *reply;
26     QString html_text;
27 };
28
29 #endif // MAINWINDOW_H

.cpp文件

 1 #include "mainwindow.h"2 #include "ui_mainwindow.h"3 4 MainWindow::MainWindow(QWidget *parent) :5     QMainWindow(parent),6     ui(new Ui::MainWindow) {7     ui->setupUi(this);8     reply = Q_NULLPTR;9 }
10
11 MainWindow::~MainWindow() {
12     delete ui;
13 }
14
15 void MainWindow::Get(QUrl u) {
16     QNetworkRequest request;
17     url=u;
18     request.setUrl(url);
19     if(reply != Q_NULLPTR) {//更改reply指向位置钱一定要保证之前的定义了自动delete
20         reply->deleteLater();
21     }
22     reply = manager.get(request);
23     qDebug() << "start get";
24     connect(reply, &QNetworkReply::finished, this, &MainWindow::finished);
25 }
26
27 void MainWindow::on_pushButton_clicked() {
28     html_text = "";
29     Get(QUrl("https://www.baidu.com/"));
30
31 }
32
33 void MainWindow::finished() {
34     QByteArray bytes = reply->readAll();
35     const QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
36     reply->deleteLater();
37     reply = Q_NULLPTR;
38     if (!redirectionTarget.isNull()) {//如果网址跳转重新请求
39         const QUrl redirectedUrl = url.resolved(redirectionTarget.toUrl());
40         qDebug()<<"redirectedUrl:"<<redirectedUrl.url();
41         Get(redirectedUrl);
42         return;
43     }
44     qDebug()<<"finished";
45     html_text = bytes;
46     qDebug()<<"get ready,read size:"<<html_text.size();
47 //    QFile f("result.html");//写出文件
48 //    f.open(QFile::WriteOnly);
49 //    f.write(bytes);
50 //    f.close();
51 }

程序很简单 on_pushButton_clicked 作为范例的入口,当点击按钮时开始访问,会传递百度的网址的到Get函数。

get函数中进行get操作,并把返回值的reply connect到finished槽。

finished中首先判断响应头是否有重定向要求,如果有重定向则销毁当前reply并利用指定的新地址重新调用get,可以试验“www.sina.com”会指向”www.sina.com.cn”

最后通过readll读取所有数据并保存到文件,双击打开文件可以看到效果。当然不会包含图片信息

其他

post使用

post其实和get类似,只不过同时还传递了串数据

post(request, data)即可,其他操作完全一样

QUrlQuery

对于上述指令直接使用QUrl赋值也是可以的,但是如果后续参数一直在变动,需要自己封装一个字符串拼接的过程。简单的办法是使用QUrlQuery

 1 QUrl url("https://techieliang.com/wp-admin/post.php");2 QUrlQuery tt;3 tt.addQueryItem("post","000");4 tt.addQueryItem("action","edit");5 tt.addQueryItem("name","techieliang");6 url.setQuery(tt);7 qDebug()<<url.url();8 tt.clear();9 tt.addQueryItem("post","000");
10 url.setQuery(tt);
11 qDebug()<<url.url();
12 url.setUrl("https://techieliang.com/wp-admin/post.php?");
13 qDebug()<<url.url();
14 url.setQuery(tt);
15 qDebug()<<url.url();

结果

1 "https://techieliang.com/wp-admin/post.php?post=000&action=edit&name=techieliang"
2 "https://techieliang.com/wp-admin/post.php?post=000"
3 "https://techieliang.com/wp-admin/post.php?"
4 "https://techieliang.com/wp-admin/post.php?post=000"
  • setUrl会将Url改为新值,并清空Query,直接更改url后需要重新setQuery
  • setQuery不会改变Url值,可以不断的setQuery去构造不同的参数
  • QUrl会自动处理url后的?若setUrl的值末尾没有?会自动在url和query之间增加,若已经包含则不会重复

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

Qt 使用QNetworkAccessManager实现Http操作相关推荐

  1. 【Qt】DOM创建和操作XML文档

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 创建XML文档 04. 读取XML文档 05. 增加XML节点 06. 查找.删除.更新XML文档 07. 附录 01. ...

  2. Qt中与文件目录相关操作

    一.与文件目录操作有关操作. Qt中与文件目录相关的操作在QDir中,需加入#include <QDir>语句. QDir::drives()是列出电脑根目录下的所有目录,返回的是QFil ...

  3. Qt 之QNetworkAccessManager 下载断点续传

    文章目录 前言 如何实现? 总结 前言 qt的QNetworkAccessManager get在下载文件时,当网络环境不确定行比较大时,比如网络断开等,往往需要程序实现断点续传的功能,好在qt帮我们 ...

  4. Qt对word文档操作总结

    Qt对word文档操作总结 近期在使用Qt对word进行读写操作时候遇到很多问题,对于Qt内部没有很好的库函数可以使用.office官网上的文档只有VBA的示例,没有Qt的语法例子.在这里作者介绍了一 ...

  5. Qt 文件和文件夹操作

    Qt 文件和文件夹操作 复制文件 设置文件的访问权限 删除文件 删除单个文件 批量删除文件 示例 获取文件信息 批量修改文件名 写文本文件 读文本文件 压缩和解压缩文件 解压 压缩 XML 文件读写 ...

  6. QT学习 (MYSQL数据库语句操作)

    一. 使用Navicat工具操作数据库 工具下载地址:https://download.csdn.net/download/dianzishi123/10805940 有一个可连接使用的数据库 打开工 ...

  7. qt 历史记录控件_基于Qt图形界面软件的操作日志记录方法及系统_2015106293015_说明书_专利查询_专利网_钻瓜专利网...

    技术领域 本发明涉及一种软件系统的日志记录技术,特别涉及一种基于Qt图形界面软件的操作日志记录方法及系统. 背景技术 软件操作日志是记录用户在使用软件的过程中,通过鼠标和键盘在操作界面上执行的点击和输 ...

  8. QT的QNetworkAccessManager类的使用

    详细说明 QNetworkAccessManager类允许应用程序发送网络请求和接收回复. 网络访问API围绕一个QNetworkAccessManager对象构造,该对象保存其发送的请求的通用配置和 ...

  9. Qt扫盲-QNetworkAccessManager理论总结

    QNetworkAccessManager理论总结 一.概述 二.基础用法 1. 下载数据 2. 上传数据 二.网络和漫游支持 一.概述 QNetworkAccessManager 其实就是一个访问网 ...

最新文章

  1. SAP PM技术对象的功能
  2. CF359D:Pair of Numbers(数论)
  3. ajax后台如何把对象转为json_57. Django 2.1.7 查询数据返回json格式
  4. Spring Boot的学习之路(03):基础环境搭建,做好学习前的准备工作
  5. 数据结构与算法 / 队列(queue)
  6. 03.full_text interval查询
  7. oracle 赋值到cmd,CMD操作oracle数据导库过程图解
  8. Gradle中的buildScript代码块
  9. C++primer第二章2.4节对于const限定符相关内容进行详解
  10. python time timeit_python运行时间计算之timeit
  11. 【转】雷军自曝创业第一年:掏自己的钱创业成功率最高
  12. SpringBoot配置多Redis数据源
  13. 01_ExtJS_HelloWorld
  14. Ajax (菜鸟教程)学习笔记
  15. mongodb删除某个字段
  16. react 实战案例(webpack构建)
  17. Docker 18.09.0更换阿里镜像加速器
  18. SAP固定资产中的几个日期
  19. 最短路径之Bellman-Ford
  20. 【ps功能精通】1.简单了解PS

热门文章

  1. UserWarning: FixedFormatter should only be used together with FixedLocator|Python点点
  2. 【跨区助手】Apex入库
  3. 织梦未审核文档禁止动态浏览
  4. 为什么索引会加快查询速度?索引原理和使用原则
  5. 海康工业相机参数设置(python)
  6. gmail 邮箱发送邮件 连接超时解决
  7. CSDN Markdown模板
  8. python 云计算 培训
  9. 关于我是如何自学Java,一个自学网站推荐How2j
  10. 043 扫描技术,OpenVAS,AWVS,永恒之蓝漏洞复现