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开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;