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_OBJECT

public:
    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 file
    QNetworkAccessManager *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 form
    QNetworkAccessManager *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 changed
     serverUrl = ui->lineEdit->text();
}

void MainWindow::on_pushButton_3_clicked()
{
    // post
    on_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()
{
    // multipart

    QNetworkAccessManager *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); 
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ada是一种适用于建立并行、嵌入式和实时应用程序的高级编程语言。Ada的设计目标是提供可靠性、可移植性和高效性,这使其成为构建复杂应用程序的理想选择。 使用Ada编写并行应用程序时,可以利用Ada的任务和任务类型来实现并发性。任务可以独立执行,并可通过任务间通信进行数据传输。这种并发性的设计使得可以同时处理多个任务,提高了系统的效率和性能。通过合理地划分任务和使用适当的同步机制,可以避免竞争条件和死锁等并发性问题。 在嵌入式应用程序开发中,Ada提供了直接访问硬件资源的能力,以及对实时性要求的支持。Ada的语言特性使得可以轻松地与底层硬件进行交互,例如使用位操作和寄存器访问等。此外,Ada还提供了对实时任务、实时时钟和实时调度等的支持,使得嵌入式系统的响应能力得以保证。 实时应用程序是对时间要求严格的应用程序。Ada提供了针对实时系统的编译器和运行时库,这使得可以编写满足实时性要求的应用程序。Ada的任务模型使得可以轻松地处理实时事件,并使用优先级规则来调度任务,确保高优先级任务能够立即获得执行机会。 总之,Ada是一个强大的语言,适用于构建并行、嵌入式和实时应用程序。其语言特性和支持使得开发人员可以高效地处理复杂性和时间要求,使得Ada成为一种值得考虑的编程语言。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值