Hands-On Mobile and Embedded Development with Qt 5 学习笔记 - QNetworkRequest

本文主要是介绍Hands-On Mobile and Embedded Development with Qt 5 学习笔记 - QNetworkRequest,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QNetworkRequest

QNetworkRequest 是网络访问功能的一部分,它构造一个请求,它可以是以下之一:

GET: get(…)
POST: post(…)
PUT: put(…)
DELETE: deleteResource(…)
HEAD: head(…)

标头可以使用 setHeader 设置为已知标头,并且可以是以下之一:

ContentDispositionHeader 内容处置头
ContentTypeHeader 内容类型标题
ContentLengthHeader 内容长度标题
LocationHeader 位置标题
LastModifiedHeader 最后修改头
CookieHeader Cookie头
SetCookieHeader 设置CookieHeader
UserAgentHeader 用户代理头
ServerHeader 服务器头

setRawHeader 设置原始或自定义标头

setAttribute 来设置HTTP 属性帮助控制请求缓存、重定向和 cookie
在这里插入图片描述

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkReply>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;void doRequest();void replyFinished(QNetworkReply *reply);
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QJsonDocument>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);doRequest();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::doRequest()
{//QNetworkRequest 是需要用来从网络请求操作的东西,比如 get 和 put//QNetworkRequest 也可以将 QUrl 作为其参数//QNetworkRequest 不是基于 QObject,因此它没有父级,也没有任何自己的信号。 所有通信都是通过 QNetworkAccessManager 完成的QNetworkRequest request;request.setUrl(QUrl("http://www.example.com"));QNetworkAccessManager *manager = new QNetworkAccessManager(this);//您要连接的一个信号是finished//假设我有一些表单数据需要传输; 我需要使用 setHeader 添加一个标准标题。 我还可以添加以下自定义标头,我称之为 X-UUID://request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");//request.setRawHeader(QByteArray("X-UUID"), QUuid::createUuid().toByteArray());connect(manager, &QNetworkAccessManager::finished,this, &MainWindow::replyFinished);manager->get(request);
}void MainWindow::replyFinished(QNetworkReply *reply)
{//获取数据回调函数if (reply->error())ui->textEdit->insertPlainText( reply->errorString());else {QList<QByteArray> headerList = reply->rawHeaderList();ui->textEdit->insertPlainText(headerList.join("\n") +"\n");QByteArray responsData = reply->readAll();ui->textEdit->insertHtml(responsData);}
}//            if (reply->rawHeader(head).contains("json")) {
//                QJsonDocument json = QJsonDocument::fromJson(response_data);
//                qWarning(json);
//            }

QNetworkAccessManager

引入管理器——QNetworkAccessManager (QNAM)。 它用于通过网络发送和接收异步请求。 通常,一个应用程序中有一个 QNAM 实例,如下所示:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

最简单的是,您可以使用 get、put、post、deleteResource 或 head 函数发出 QNAM 请求。

QNAM 使用信号来传输数据和请求信息,而finished() 信号用于在请求完成时发出信号。

 connect(manager, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished);

这将使用 QNetworkReply 参数中的数据和标头调用您的 replyFinished 槽,如下所示:

void MainWindow::replyFinished(QNetworkReply *reply) 
{ if (reply->error()) ui->textEdit->insertPlainText( reply->errorString()); else { QList<QByteArray> headerList = reply->rawHeaderList(); ui->textEdit->insertPlainText(headerList.join("\n") +"\n"); QByteArray responsData = reply->readAll(); ui->textEdit->insertHtml(responsData); } 
}

然后,在 QNetworkAccessManager 上调用 get 方法,如下所示:

manager->get(request);
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>#include <QDir>
#include <QFileDialog>
#include <QFile>
#include <QUrlQuery>
#include <QHttpPart>
#include <QHttpMultiPart>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{on_lineEdit_returnPressed();// send fileQNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request;request.setUrl(QUrl(serverUrl));QFileDialog dialog(this);dialog.setFileMode(QFileDialog::AnyFile);QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath());if (!filename.isEmpty()) {QFile file(filename);if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {QByteArray fileBytes = file.readAll();manager->put(request, fileBytes);}}
}void MainWindow::on_pushButton_2_clicked()
{on_lineEdit_returnPressed();// send formQNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request;QUrl url(serverUrl);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");QUrlQuery formData;formData.addQueryItem("login", "me");formData.addQueryItem("password", "123");formData.addQueryItem("submit", "Send");url.setQuery(formData);request.setUrl(url);manager->get(request);
}void MainWindow::on_lineEdit_returnPressed()
{// url changedserverUrl = ui->lineEdit->text();
}void MainWindow::on_pushButton_3_clicked()
{// poston_lineEdit_returnPressed();QNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request;QUrl url(serverUrl);QByteArray postData;postData.append("?login=me&password=123&submit=Send+data");manager->post(request, postData);
}void MainWindow::on_pushButton_4_clicked()
{// multipartQNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request;QUrl url(serverUrl);QFileDialog dialog(this);dialog.setFileMode(QFileDialog::AnyFile);QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath());if (filename.isEmpty())return;QFile *file = new QFile(filename);if (file->open(QIODevice::ReadOnly)) {QByteArray fileBytes = file->readAll();QHttpMultiPart *multiPart =new QHttpMultiPart(QHttpMultiPart::FormDataType);QHttpPart textPart;textPart.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"filename\""));textPart.setBody(filename.toLocal8Bit());QHttpPart filePart;filePart.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"file\""));filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/zip"));filePart.setBodyDevice(file);file->setParent(multiPart);multiPart->append(textPart);multiPart->append(filePart);manager->put(request, multiPart);}}

创建文件上传的方法也同样简单。 当然你的web服务器需要支持put方法,如下:

    QFileDialog dialog(this); dialog.setFileMode(QFileDialog::AnyFile); QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::homePath()); if (!filename.isEmpty()) { QFile file(filename); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QByteArray fileBytes = file.readAll(); manager->put(request, fileBytes); } }

如果需要在URL中发送一些查询参数,可以使用QUrlQuery构造表单查询数据,然后发送请求如下:

QNetworkRequest request;
QUrl url("http://www.example.com");QUrlQuery formData;
formData.addQueryItem("login", "me");
formData.addQueryItem("password", "123");
formData.addQueryItem("submit", "Send");
url.setQuery(formData);
request.setUrl(url);
manager->get(request);

表单数据可以通过 post 函数作为 QByteArray 上传,如下所示:

QByteArray postData;
postData.append("?login=me&password=123&submit=Send");
manager->post(request, postData);

要发送多部分表单数据,例如表单数据和图像,您可以使用 QHttpMultiPart 如下:

QFile *file = new QFile(filename); if (file->open(QIODevice::ReadOnly)) { QByteArray fileBytes = file->readAll(); QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart textPart; textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"filename\"")); textPart.setBody(filename.toLocal8Bit()); QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"")); filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/zip")); filePart.setBodyDevice(file); file->setParent(multiPart); multiPart->append(textPart); multiPart->append(filePart); manager->put(request, multiPart); }

这篇关于Hands-On Mobile and Embedded Development with Qt 5 学习笔记 - QNetworkRequest的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示