QT(17)- QNetworkAccessManager

news2024/9/25 17:18:06

QT(17)- QNetworkAccessManager

  • 1 简介
  • 2 公有类型
  • 3 函数
    • 3.1 addStrictTransportSecurityHosts
    • 3.2 autoDeleteReplies
    • 3.3 cache
    • 3.4 clearAccessCache
    • 3.5 clearConnectionCache
    • 3.6 connectToHost
    • 3.7 connectToHostEncrypted
    • 3.8 cookieJar
    • 3.9 deleteResource
    • 3.10 enableStrictTransportSecurityStore
    • 3.11 get
    • 3.12 head
    • 3.13 isStrictTransportSecurityEnabled
    • 3.14 isStrictTransportSecurityStoreEnabled
    • 3.15 post
    • 3.16 proxy
    • 3.17 proxyFactory
    • 3.18 put
    • 3.19 redirectPolicy
    • 3.20 sendCustomReques
    • 3.21 setAutoDeleteReplies
    • 3.22 setCache
  • 4 Signals
  • 5 Protected Functions
  • 6 Protected Slots

1 简介

QNetworkAccessManager是Qt网络模块中的一个类,它用于管理网络请求和响应。它可以发送HTTP请求,处理HTTP响应,支持文件上传和下载,以及支持多种网络协议。

QNetworkAccessManager使用异步方式发送请求和处理响应,这意味着它可以在不阻塞应用程序UI线程的情况下进行网络通信。当一个请求被发送时,QNetworkAccessManager将立即返回一个QNetworkReply对象,该对象可以用于监视请求的进度,访问响应数据以及处理响应错误。

QNetworkAccessManager可以使用各种不同的请求类型,包括GET、POST、PUT、DELETE等。它还支持设置请求头、查询参数、表单数据等,以及可以设置代理服务器。

使用QNetworkAccessManager发送HTTP请求的基本流程如下:

  • 创建QNetworkAccessManager对象
  • 创建QNetworkRequest对象,设置请求URL和请求头
  • 使用QNetworkAccessManager的get()、post()、put()等函数发送请求
  • 处理QNetworkReply对象以获取响应数据

QNetworkAccessManager可以方便地集成到Qt应用程序中,使应用程序可以与远程服务器进行通信。

2 公有类型

在这里插入图片描述

3 函数

3.1 addStrictTransportSecurityHosts

void addStrictTransportSecurityHosts(const QVector<QHstsPolicy> &knownHosts)
addStrictTransportSecurityHosts是QNetworkConfigurationManager类中的一个函数,用于向已知主机列表中添加HSTS(HTTP Strict Transport Security)策略。

HSTS是一种Web安全策略,通过HTTP响应头告知浏览器只能使用HTTPS连接来访问该网站,从而提高安全性。在服务器发送HSTS响应头后,浏览器将在一段时间内(通常是几个月)内记住该主机的HSTS策略,并自动将所有未来的HTTP请求重定向到HTTPS。当然,这仅适用于已经使用过HTTPS的站点。

在Qt中,可以使用QHstsPolicy类来表示一个主机的HSTS策略,其构造函数接受一个主机名和一个时间戳参数。可以通过调用addStrictTransportSecurityHosts函数向QNetworkConfigurationManager添加一个或多个已知的主机的HSTS策略,从而增强应用程序的网络安全性。

函数参数knownHosts是一个QVector类型的向量,包含要添加的主机列表。

3.2 autoDeleteReplies

bool QNetworkAccessManager::autoDeleteReplies() const
QNetworkAccessManager::autoDeleteReplies()是一个函数,用于返回当前QNetworkAccessManager是否配置为自动删除QNetworkReply对象。如果设置为自动删除,QNetworkAccessManager将在QNetworkReply对象完成后自动删除该对象,否则QNetworkReply对象需要手动删除。

该函数在Qt 5.14版本中引入。

默认情况下,QNetworkAccessManager的自动删除QNetworkReply的功能是启用的,这意味着当QNetworkReply对象完成后,QNetworkAccessManager将自动删除该对象。如果你想手动管理QNetworkReply对象的生命周期,可以通过调用QNetworkAccessManager的setAutoDeleteReplies(false)来禁用自动删除功能,然后手动删除QNetworkReply对象

3.3 cache

QAbstractNetworkCache *QNetworkAccessManager::cache() const
QNetworkAccessManager::cache()是一个函数,用于获取QNetworkAccessManager使用的网络数据缓存。返回的是一个指向QAbstractNetworkCache对象的指针。

QNetworkAccessManager可以使用缓存来存储从网络获取的数据,从而避免重复下载数据。如果应用程序需要在多个网络请求之间共享数据,可以使用缓存。默认情况下,QNetworkAccessManager使用QNetworkDiskCache类来管理网络数据缓存,该类将缓存数据保存在磁盘上。可以使用setCache()函数来设置其他类型的缓存,例如QNetworkMemoryCache,该类将缓存数据保存在内存中。

void QNetworkAccessManager::setCache(QAbstractNetworkCache *cache)
QNetworkAccessManager::setCache()是一个函数,用于设置QNetworkAccessManager使用的网络数据缓存。可以通过传递指向QAbstractNetworkCache对象的指针来设置缓存。QNetworkAccessManager将在处理所有网络请求时使用指定的缓存。需要注意的是,QNetworkAccessManager将拥有缓存对象的所有权,并负责在合适的时间删除缓存对象。

默认情况下,QNetworkAccessManager没有设置网络数据缓存。可以使用setCache()函数来设置其他类型的缓存,例如QNetworkMemoryCache或QNetworkDiskCache。设置网络数据缓存可以提高应用程序的性能,因为这样可以避免重复下载数据

3.4 clearAccessCache

void QNetworkAccessManager::clearAccessCache()
QNetworkAccessManager::clearAccessCache()是一个函数,用于刷新QNetworkAccessManager内部的身份验证数据和网络连接缓存。该函数通常用于自动化测试等情况下,需要清空缓存来进行多个独立测试的场合。

QNetworkAccessManager维护一个内部缓存,用于存储身份验证信息和网络连接信息,以便在未来的请求中重用这些信息。在某些情况下,可能需要清空这些缓存,例如在进行多个独立测试时,以确保每个测试的环境都是独立的。

以下是一个示例代码,展示了如何使用QNetworkAccessManager::clearAccessCache()函数清空访问缓存:

QNetworkAccessManager *manager = new QNetworkAccessManager();
// 向manager发送请求,填充缓存

// 执行测试
// ...

// 清空缓存
manager->clearAccessCache();

// 执行下一个测试
// ...

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象,并发送一些请求,以填充内部缓存。然后,执行一些测试代码,之后调用clearAccessCache()函数清空访问缓存,以确保下一个测试环境是独立的。需要注意的是,clearAccessCache()函数只清空身份验证数据和网络连接信息的缓存,而不会清空其他缓存,例如DNS缓存或网络数据缓存。如果需要清空其他缓存,请使用相关的函数,例如QNetworkDiskCache::clear()函数。

3.5 clearConnectionCache

void QNetworkAccessManager::clearConnectionCache()
QNetworkAccessManager::clearConnectionCache()是一个函数,用于刷新QNetworkAccessManager内部的网络连接缓存。与clearAccessCache()不同的是,该函数保留身份验证数据。

该函数在Qt 5.9版本中引入。

QNetworkAccessManager维护一个内部缓存,用于存储网络连接信息,以便在未来的请求中重用这些信息。在某些情况下,可能需要清空这些缓存,例如在进行多个独立测试时,以确保每个测试的环境都是独立的。与clearAccessCache()不同,clearConnectionCache()只清空网络连接缓存,而保留身份验证数据。

3.6 connectToHost

void QNetworkAccessManager::connectToHost(const QString &hostName, quint16 port = 80)
QNetworkAccessManager::connectToHost()是一个函数,用于在发起HTTP请求之前,建立到指定主机的TCP连接。该函数可以降低网络延迟,提高HTTP请求的响应速度。

该函数在Qt 5.2版本中引入。

QNetworkAccessManager默认是在HTTP请求时,自动建立到目标主机的TCP连接。这意味着当你发起HTTP请求时,QNetworkAccessManager会自动完成TCP握手,建立TCP连接,并在该连接上发送HTTP请求。使用connectToHost()函数可以在发起HTTP请求之前,手动建立到主机的TCP连接,从而降低网络延迟。

需要注意的是,connectToHost()函数没有错误报告的可能性,因此,建议使用QNetworkAccessManager默认的自动连接功能,除非你有充分的理由需要手动建立TCP连接。

以下是一个示例代码,展示了如何使用QNetworkAccessManager::connectToHost()函数手动建立到主机的TCP连接:

QNetworkAccessManager *manager = new QNetworkAccessManager();

// 建立到主机的TCP连接
manager->connectToHost("www.example.com", 80);

// 发起HTTP请求
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl("http://www.example.com")));
connect(reply, &QNetworkReply::finished, this, [reply]() {
    // 处理响应数据
    QByteArray data = reply->readAll();
    qDebug() << "Received data:" << data;
});
delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象,然后使用connectToHost()函数手动建立到主机的TCP连接。接着发送一个GET请求,获取QNetworkReply对象,并处理响应数据。需要注意的是,由于connectToHost()函数没有错误报告的可能性,因此必须在发起HTTP请求之前,确保TCP连接已经成功建立。如果TCP连接未能成功建立,则可能导致HTTP请求失败或超时。

3.7 connectToHostEncrypted

void connectToHostEncrypted(const QString &hostName, quint16 port = 443, const QSslConfiguration &sslConfiguration = QSslConfiguration::defaultConfiguration())

void connectToHostEncrypted(const QString &hostName, quint16 port, const QSslConfiguration &sslConfiguration, const QString &peerName)
QNetworkAccessManager::connectToHostEncrypted()是一个函数,用于在发起HTTPS请求之前,建立到指定主机的安全TCP连接。该函数可以手动建立到主机的安全TCP连接,从而提高HTTPS请求的响应速度。

该函数可以有两个版本,其中一个版本需要提供peerName参数,用于验证服务器的证书。

这两个函数在Qt 4.6版本中引入。

QNetworkAccessManager默认情况下是在HTTPS请求时,自动建立到目标主机的安全TCP连接。这意味着当你发起HTTPS请求时,QNetworkAccessManager会自动完成SSL握手,建立安全TCP连接,并在该连接上发送HTTPS请求。使用connectToHostEncrypted()函数可以在发起HTTPS请求之前,手动建立到主机的安全TCP连接,从而提高HTTPS请求的响应速度。

以下是一个示例代码,展示了如何使用QNetworkAccessManager::connectToHostEncrypted()函数手动建立到主机的安全TCP连接:

QNetworkAccessManager *manager = new QNetworkAccessManager();

// 建立到主机的安全TCP连接
QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
sslConfig.setProtocol(QSsl::TlsV1_2);
manager->connectToHostEncrypted("www.example.com", 443, sslConfig);

// 发起HTTPS请求
QNetworkRequest request(QUrl("https://www.example.com"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
QNetworkReply *reply = manager->post(request, QByteArray("hello"));
connect(reply, &QNetworkReply::finished, this, [reply]() {
    // 处理响应数据
    QByteArray data = reply->readAll();
    qDebug() << "Received data:" << data;
});

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象,然后使用connectToHostEncrypted()函数手动建立到主机的安全TCP连接。接着发送一个POST请求,获取QNetworkReply对象,并处理响应数据。需要注意的是,由于connectToHostEncrypted()函数需要手动建立安全TCP连接,因此必须在发起HTTPS请求之前,确保安全TCP连接已经成功建立。如果安全TCP连接未能成功建立,则可能导致HTTPS请求失败或超时。另外,如果使用需要peerName参数的函数,需要提供正确的服务器证书名称进行验证,否则将无法建立安全连接。

3.8 cookieJar

QNetworkCookieJar * cookieJar() const
QNetworkAccessManager::cookieJar()是一个函数,用于返回QNetworkAccessManager正在使用的cookie jar对象。Cookie jar用于存储和管理QNetworkAccessManager处理的所有HTTP cookies。

HTTP cookie是服务器在客户端存储的一小段文本信息,用于跟踪用户会话和识别用户。QNetworkAccessManager默认会自动管理HTTP cookie,包括从服务器接收cookie和在后续请求中发送cookie。可以通过设置QNetworkAccessManager的cookie jar对象来管理HTTP cookie,以便在多个请求之间共享cookie信息。

void QNetworkAccessManager::setCookieJar(QNetworkCookieJar *cookieJar)
QNetworkAccessManager::setCookieJar()是一个函数,用于设置QNetworkAccessManager正在使用的cookie jar对象。Cookie jar用于存储和管理QNetworkAccessManager处理的所有HTTP cookies。

HTTP cookie是服务器在客户端存储的一小段文本信息,用于跟踪用户会话和识别用户。QNetworkAccessManager默认会自动管理HTTP cookie,包括从服务器接收cookie和在后续请求中发送cookie。可以通过设置QNetworkAccessManager的cookie jar对象来管理HTTP cookie,以便在多个请求之间共享cookie信息。

以下是一个示例代码,展示了如何使用QNetworkAccessManager::setCookieJar()函数设置cookie jar对象:

QNetworkAccessManager *manager = new QNetworkAccessManager();

// 设置cookie jar
QNetworkCookieJar *cookieJar = new MyCookieJar();
manager->setCookieJar(cookieJar);

// 发起HTTP请求
QNetworkRequest request(QUrl("http://www.example.com"));
QNetworkReply *reply = manager->get(request);
connect(reply, &QNetworkReply::finished, this, [reply]() {
    // 处理响应数据
    QByteArray data = reply->readAll();
    qDebug() << "Received data:" << data;
});

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象,然后使用setCookieJar()函数设置cookie jar对象为一个自定义的MyCookieJar对象。接着,我们发送一个GET请求,获取QNetworkReply对象,并处理响应数据。需要注意的是,在实际使用中,如果需要对cookie进行更复杂的管理,可以实现自己的QNetworkCookieJar子类,并重写QNetworkCookieJar::cookiesForUrl()和QNetworkCookieJar::setCookiesFromUrl()函数,以便实现自己的安全策略。

3.9 deleteResource

QNetworkReply *QNetworkAccessManager::deleteResource(const QNetworkRequest &request)
QNetworkAccessManager::deleteResource()是一个函数,用于发送一个HTTP DELETE请求,删除由request标识的URL对应的资源。该函数只能用于HTTP协议。
HTTP DELETE请求用于请求服务器删除指定URL对应的资源。使用QNetworkAccessManager的deleteResource()函数可以方便地向服务器发送DELETE请求。

3.10 enableStrictTransportSecurityStore

void QNetworkAccessManager::enableStrictTransportSecurityStore(bool enabled, const QString &storeDir = QString())
QNetworkAccessManager::enableStrictTransportSecurityStore()是一个函数,用于启用或禁用内部的HSTS缓存,并将HSTS策略写入持久化存储。如果启用了持久化存储,storeDir参数指定了持久化存储的路径。如果storeDir参数为空字符串,则存储路径默认为QStandardPaths::CacheLocation,即缓存目录。如果没有可写的缓存目录,并且storeDir为空字符串,则存储路径将在程序的工作目录中。

需要注意的是,如果启用持久化存储,QNetworkAccessManager会将HSTS策略写入磁盘,并从磁盘读取缓存中的策略。在启用持久化存储之前,如果缓存中已经包含了一些HSTS策略,则这些策略将会被保留在缓存中,并且缓存中的策略会覆盖磁盘中的策略。因此,在启用持久化存储之前,应该清空缓存。另外,如果缓存和持久化存储中都包含了相同的主机名和HSTS策略,缓存中的策略将被认为是最新的,并覆盖持久化存储中的策略。

3.11 get

QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
QNetworkAccessManager::get()是一个函数,用于发送一个HTTP GET请求,并返回一个新的QNetworkReply对象,用于读取响应数据。在获取到新数据时,QNetworkReply对象会发出readyRead()信号。

HTTP GET请求用于请求服务器获取指定URL对应的资源。使用QNetworkAccessManager的get()函数可以方便地向服务器发送GET请求,并读取响应数据。

QNetworkAccessManager *manager = new QNetworkAccessManager();

// 发送GET请求
QUrl url("http://www.example.com");
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request);
connect(reply, &QNetworkReply::finished, this, [reply]() {
    // 处理响应数据
    QByteArray data = reply->readAll();
    qDebug() << "Received data:" << data;
});

delete manager;

3.12 head

QNetworkReply *QNetworkAccessManager::head(const QNetworkRequest &request)
QNetworkAccessManager::head()是一个函数,用于发送一个HTTP HEAD请求,获取与请求相关的网络头,并返回一个新的QNetworkReply对象,用于包含这些头。

HTTP HEAD请求类似于HTTP GET请求,但是只返回与请求相关的HTTP头信息,而不返回实际的资源内容。通常,HTTP HEAD请求用于获取资源的元数据或检查资源是否存在,而不需要实际下载资源内容。

QNetworkAccessManager *manager = new QNetworkAccessManager();

// 发送HEAD请求
QUrl url("http://www.example.com");
QNetworkRequest request(url);
QNetworkReply *reply = manager->head(request);
connect(reply, &QNetworkReply::finished, this, [reply]() {
    // 处理响应头数据
    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    QVariant contentLength = reply->header(QNetworkRequest::ContentLengthHeader);
    qDebug() << "Status code:" << statusCode.toInt();
    qDebug() << "Content length:" << contentLength.toInt();
});

delete manager;

3.13 isStrictTransportSecurityEnabled

bool QNetworkAccessManager::isStrictTransportSecurityEnabled() const
QNetworkAccessManager::isStrictTransportSecurityEnabled()是一个函数,用于判断HTTP Strict Transport Security (HSTS)是否已启用。如果已启用,返回true;否则返回false。默认情况下,HSTS是禁用的。

HTTP Strict Transport Security (HSTS)是一种安全机制,用于保护Web应用程序免受SSL剥离攻击和会话劫持攻击。当客户端和服务器首次建立HTTPS连接时,服务器可以向客户端发送HSTS响应头,要求客户端在接下来的一段时间内(例如6个月)始终使用HTTPS访问该站点。在HSTS生命周期内,如果客户端尝试使用HTTP连接到该站点,浏览器会自动将请求重定向到HTTPS。

3.14 isStrictTransportSecurityStoreEnabled

bool QNetworkAccessManager::isStrictTransportSecurityStoreEnabled() const
QNetworkAccessManager::isStrictTransportSecurityStoreEnabled()是一个函数,用于判断HTTP Strict Transport Security (HSTS)缓存是否已启用持久化存储。如果已启用,返回true;否则返回false。

3.15 post

QNetworkReply * post(const QNetworkRequest &request, QIODevice *data)
QNetworkReply * post(const QNetworkRequest &request, const QByteArray &data)
QNetworkReply * post(const QNetworkRequest &request, QHttpMultiPart *multiPart)

第一种重载形式中,data参数是一个QIODevice对象,可以用于发送二进制数据、文件数据等。下面是一个示例代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request(QUrl("http://www.example.com/upload"));

QFile *file = new QFile("test.txt");
file->open(QIODevice::ReadOnly);

QNetworkReply *reply = manager->post(request, file);
file->setParent(reply); // 所有者设为reply,以便reply析构时能够关闭文件

// 处理reply的数据读取等操作

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象和一个QNetworkRequest对象,然后创建一个QFile对象,并用open()函数打开文件。最后,我们使用QNetworkAccessManager的post()函数发送文件内容,并将文件对象设置为QNetworkReply对象的子对象。在reply被析构时,文件对象也会被自动关闭。

第二种重载形式中,data参数是一个QByteArray对象,可以用于发送纯文本数据、JSON数据等。下面是一个示例代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request(QUrl("http://www.example.com/api"));

QByteArray postData;
postData.append("username=johndoe&password=secret");

QNetworkReply *reply = manager->post(request, postData);

// 处理reply的数据读取等操作

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象和一个QNetworkRequest对象,然后创建一个QByteArray对象,并将POST数据写入该对象。最后,我们使用QNetworkAccessManager的post()函数发送POST请求,并处理reply对象的数据读取等操作。

第三种重载形式中,multiPart参数是一个QHttpMultiPart对象,可以用于发送文件、表单数据等。QHttpMultiPart是一个较为复杂的对象,可以包含多个QHttpPart对象。以下是一个示例代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request(QUrl("http://www.example.com/upload"));

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart textPart;
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"username\""));
textPart.setBody("johndoe");

QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"test.jpg\""));

QFile *file = new QFile("test.jpg");
file->open(QIODevice::ReadOnly);
filePart.setBodyDevice(file);
file->setParent(multiPart); // 所有者设为multiPart,以便multiPart析构时能够关闭文件

multiPart->append(textPart);
multiPart->append(filePart);

QNetworkReply *reply = manager->post(request, multiPart);
multiPart->setParent(reply); // 所有者设为reply,以便reply析构时能够删除multiPart

// 处理reply的数据读取等操作

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象和一个QNetworkRequest对象,然后创建一个QHttpMultiPart对象,并创建两个QHttpPart对象用于发送纯文本数据和文件数据。最后,我们使用QNetworkAccessManager的post()函数发送POST请求,并将QHttpMultiPart对象设置为QNetworkReply对象的子对象。在reply被析构时,QHttpMultiPart对象也会被自动删除。

3.16 proxy

QNetworkProxy proxy() const
该函数返回QNetworkAccessManager对象的代理服务器配置。如果QNetworkAccessManager对象没有设置代理服务器,则返回一个空的QNetworkProxy对象。

3.17 proxyFactory

QNetworkProxyFactory * proxyFactory() const
该函数返回QNetworkAccessManager对象的代理工厂。代理工厂用于创建QNetworkProxy对象,以便QNetworkAccessManager对象可以使用代理服务器转发网络请求。如果QNetworkAccessManager对象没有设置代理工厂,则返回一个空的QNetworkProxyFactory对象。

3.18 put

QNetworkReply * put(const QNetworkRequest &request, QIODevice *data)
QNetworkReply * put(const QNetworkRequest &request, const QByteArray &data)
QNetworkReply * put(const QNetworkRequest &request, QHttpMultiPart *multiPart)

第一种重载形式中,data参数是一个QIODevice对象,可以用于发送二进制数据、文件数据等。下面是一个示例代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request(QUrl("http://www.example.com/upload"));

QFile *file = new QFile("test.txt");
file->open(QIODevice::ReadOnly);

QNetworkReply *reply = manager->put(request, file);
file->setParent(reply); // 所有者设为reply,以便reply析构时能够关闭文件

// 处理reply的数据读取等操作

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象和一个QNetworkRequest对象,然后创建一个QFile对象,并用open()函数打开文件。最后,我们使用QNetworkAccessManager的put()函数发送文件内容,并将文件对象设置为QNetworkReply对象的子对象。在reply被析构时,文件对象也会被自动关闭。

第二种重载形式中,data参数是一个QByteArray对象,可以用于发送纯文本数据、JSON数据等。下面是一个示例代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request(QUrl("http://www.example.com/api"));

QByteArray putData;
putData.append("username=johndoe&password=secret");

QNetworkReply *reply = manager->put(request, putData);

// 处理reply的数据读取等操作

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象和一个QNetworkRequest对象,然后创建一个QByteArray对象,并将PUT数据写入该对象。最后,我们使用QNetworkAccessManager的put()函数发送PUT请求,并处理reply对象的数据读取等操作。

第三种重载形式中,multiPart参数是一个QHttpMultiPart对象,可以用于发送文件、表单数据等。QHttpMultiPart是一个较为复杂的对象,可以包含多个QHttpPart对象。以下是一个示例代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request(QUrl("http://www.example.com/upload"));

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart textPart;
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"username\""));
textPart.setBody("johndoe");

QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"test.jpg\""));

QFile *file = new QFile("test.jpg");
file->open(QIODevice::ReadOnly);
filePart.setBodyDevice(file);
file->setParent(multiPart); // 所有者设为multiPart,以便multiPart析构时能够关闭文件

multiPart->append(textPart);
multiPart->append(filePart);

QNetworkReply *reply = manager->put(request, multiPart);
multiPart->setParent(reply); // 所有者设为reply,以便reply析构时能够删除multiPart

// 处理reply的数据读取等操作

delete manager;

3.19 redirectPolicy

QNetworkRequest::RedirectPolicy redirectPolicy() const
QNetworkRequest类中的redirectPolicy()函数可以用于获取网络请求的重定向策略。重定向是指当网络请求的URL发生变化时,服务器会向客户端返回一个重定向响应,以便客户端跳转到新的URL上。重定向策略决定了网络请求在遇到重定向响应时的行为。

该函数返回QNetworkRequest对象的重定向策略,它是一个QNetworkRequest::RedirectPolicy类型的枚举值。以下是QNetworkRequest::RedirectPolicy类型的枚举值:

  • QNetworkRequest::ManualRedirectPolicy:表示网络请求遇到重定向响应时,不会自动跳转到新的URL上,而是会发出finished()信号,由程序员决定是否进行跳转。
  • QNetworkRequest::AutoRedirectPolicy:表示网络请求遇到重定向响应时,会自动跳转到新的URL上。
  • QNetworkRequest::NoLessSafeRedirectPolicy:表示网络请求遇到重定向响应时,只会跳转到比原URL更安全的URL上。
  • QNetworkRequest::SameOriginRedirectPolicy:表示网络请求遇到重定向响应时,只会跳转到与原URL属于同一个域名的URL上。

以下是一个示例代码:

QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request(QUrl("http://www.example.com/old_url"));

// 设置重定向策略为ManualRedirectPolicy
request.setRedirectPolicy(QNetworkRequest::ManualRedirectPolicy);

QNetworkReply *reply = manager->get(request);

connect(reply, &QNetworkReply::finished, [=]() {
    if (reply->error() == QNetworkReply::NoError) {
        QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
        qDebug() << "The request was redirected to" << redirectUrl;

        // 手动跳转到新的URL上
        request.setUrl(redirectUrl);
        reply = manager->get(request);
    } else {
        qDebug() << "Failed to perform the request:" << reply->errorString();
    }

    reply->deleteLater();
});

delete manager;

在这个示例中,我们首先创建一个QNetworkAccessManager对象和一个QNetworkRequest对象,并将重定向策略设置为ManualRedirectPolicy。接着,我们使用QNetworkAccessManager的get()函数发送网络请求,当请求完成时,会发出finished()信号。在信号槽函数中,我们判断请求是否成功,如果成功,则获取重定向URL,并使用QNetworkAccessManager的get()函数手动跳转到新的URL上。如果请求失败,则输出错误信息。

注意:在上述示例中,我们手动跳转到新的URL上,这可能会导致一些安全问题,因此在实际开发中应该谨慎使用ManualRedirectPolicy策略。一般情况下,我们建议使用AutoRedirectPolicy策略。

3.20 sendCustomReques

QNetworkReply * sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = nullptr)
QNetworkReply * sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data)
QNetworkReply * sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart)
QNetworkAccessManager类中的sendCustomRequest()函数可以用于发送自定义的网络请求,这些网络请求可以使用任意的HTTP方法(如GET、POST、PUT等)。这些自定义的请求不同于QNetworkAccessManager中提供的get()、post()、put()等函数,因为它们使用了自定义的HTTP方法,因此我们需要手动设置请求头。

3.21 setAutoDeleteReplies

void setAutoDeleteReplies(bool shouldAutoDelete)

3.22 setCache

void setCache(QAbstractNetworkCache *cache)
void setCookieJar(QNetworkCookieJar *cookieJar)
void setProxy(const QNetworkProxy &proxy)
void setProxyFactory(QNetworkProxyFactory *factory)
void setRedirectPolicy(QNetworkRequest::RedirectPolicy policy)
void setStrictTransportSecurityEnabled(bool enabled)
void setTransferTimeout(int timeout = QNetworkRequest::DefaultTransferTimeoutConstant)
QVector<QHstsPolicy> strictTransportSecurityHosts() const
QStringList supportedSchemes() const
int transferTimeout() const

4 Signals

void authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator)
void encrypted(QNetworkReply *reply)
void finished(QNetworkReply *reply)
void preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator)
void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)
void sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)

5 Protected Functions

virtual QNetworkReply * createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData = nullptr)

6 Protected Slots

QStringList supportedSchemesImplementation() const

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Metasploit框架基础(一)

文章目录前言一、基础认知二、批量POC/EXP的构想三、poc检测框架的简单实现四、xray五、Meatsploit框架参考前言 Metasploit 一款渗透测试框架漏洞利用的集合与构建和定制满足你的需求的基础漏洞利用和验证的工具 这几个说法都是百度或者官方文档中出现的手法&#xff0c;说…

ASEMI代理FGH60N60SFD,安森美FGH60N60SFD原装IGBT

编辑-Z 安森美FGH60N60SFD原装IGBT参数&#xff1a; 型号&#xff1a;FGH60N60SFD 集电极到发射极电压&#xff08;VCES&#xff09;&#xff1a;600V 栅极到发射极电压&#xff08;VGES&#xff09;&#xff1a;20V 收集器电流&#xff08;IC&#xff09;&#xff1a;120…

【Spark分布式内存计算框架——Spark SQL】9. Dataset(下)RDD、DF与DS转换与面试题

5.3 RDD、DF与DS转换 实际项目开发中&#xff0c;常常需要对RDD、DataFrame及Dataset之间相互转换&#xff0c;其中要点就是Schema约束结构信息。 1&#xff09;、RDD转换DataFrame或者Dataset 转换DataFrame时&#xff0c;定义Schema信息&#xff0c;两种方式转换为Dataset时…

由浅入深掌握 Python 进程间通信的各类方式

由浅入深掌握 Python 多进程间通信各类方式1、为什么要掌握进程间通信2、进程间各类通信方式简介3、消息机制通信1) 管道 Pipe 通信方式2) 消息队列Queue 通信方式4、同步机制通信(1) 进程间同步锁 – Lock(2) 子进程间协调机制 -- Event5、共享内存方式通信(1) 共享变量(2) 共…

【Bluetooth开发】蓝牙开发入门

BLE 蓝牙设备在生活中无处不在&#xff0c;但是我们也只是将其作为蓝牙模块进行使用&#xff0c;发送简单的AT命令实现数据收发。 那么&#xff0c;像对于一些复杂的使用场合&#xff1a;“车载蓝牙”、"智能手表"、“蓝牙音箱”等&#xff0c;我们不得不去了解底层…

千锋教育+计算机四级网络-计算机网络学习-04

UDP概述 UDP协议 面向无连接的用户数据报协议&#xff0c;在传输数据前不需要先建立连接&#xff1b;目地主机的运输层收到UDP报文后&#xff0c;不需要给出任何确认 UDP特点 相比TCP速度稍快些简单的请求/应答应用程序可以使用UDP对于海量数据传输不应该使用UDP广播和多播应用…

VectorDraw Web Library 10.1003.0.1 Crack

将 CAD 绘图和矢量对象显示添加到您的 HTML5 应用程序。 VectorDraw Web Library 是一个矢量图形库&#xff0c;旨在不仅可以打开 CAD 绘图&#xff0c;还可以在任何支持 HTML 5 标准的平台&#xff08;例如 Windows、Android、IOS 和 Linux&#xff09;上显示通用矢量对象。它…

MySQL 9:MySQL存储引擎

数据库存储引擎是数据库的底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎来创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技术、锁定级别等。 许多不同的数据库管理系统现在支持许多不同的数据引擎。 MySQL的核心是…

字符串匹配 - 模式预处理:KMP 算法(Knuth-Morris-Pratt)

Knuth-Morris-Pratt算法&#xff08;简称KMP&#xff09;是最常用的字符串匹配算法之一。算法简介如下算法解释主要来源于这里&#xff0c;但是通常很难阅读完全&#xff0c;我推荐你直接进入下一节 图例解释部分。我们来观察一下朴素的字符串匹配算法的操作过程。如下图&#…

Linux调试器gdb

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 ​ 目录 前言 正文 下载gdb 生成可调式文件 进入gdb gdb常用指令 查看代码 l 运行程序 r 断点设置 b 显示信息 info 查看断点 info b 删除断点 d …

CentOS7突然没法上网【Network 中wired 图标消失】

参考文章(七种办法)&#xff1a;CentOS 7 右上角网络连接图标消失,设置网络有线消失解决办法 正常图标消失&#xff0c;先在 终端命令 依次执行以下命令 service NetworkManager stop service network restart service NetworkManager start 一、问题真烦 CentOS7图形化界面安装…

Day893.MySQL 实例健康状态检测方法 -MySQL实战

MySQL 实例健康状态检测方法 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于MySQL 实例健康状态检测方法的内容。 在一主一备的双 M 架构里&#xff0c;主备切换只需要把客户端流量切到备库&#xff1b;而在一主多从架构里&#xff0c;主备切换除了要把客户端流量切…

搭建企业级docker仓库—Harbor

一、简介 docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在…

String是如何保证不变的?反射为什么可以改变String的值?

String是如何保证不变的&#xff1f;反射为什么可以改变String的值&#xff1f; 1. String字符串的源码分析 String 字符串到底能不能改变已经是老生常谈的问题了&#xff0c;但是在面试环节中&#xff0c;依然能够难住不少人。 下面我们根据 JDK1.8 版本下的String源码进行…

微信Hook逆向-获取登录二维码

文章目录前言一、打开Pc微信&#xff0c;切换到二维码界面二、解析当前二维码内容三、利用Cheat Enginer软件扫描二维码解析文本四、寻找静态偏移五.代码获取二维码网址前言 微信二维码可以Hook获取,也可以通过找到静态偏移的方式读取 提示&#xff1a;以下是本篇文章正文内容…

力扣(LeetCode)240. 搜索二维矩阵 II(C++)

题目描述 枚举 枚举整个矩阵&#xff0c;找到等于 target 的元素&#xff0c;则 return true &#xff0c;否则 return false。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n matrix.size(), m matrix[0]…

DataWhale 大数据处理技术组队学习task2

三、Hadoop分布式文件系统 1. 产生背景 数据量越来越大&#xff0c;一台独立的计算机已经无法存储所有的数据---->将大规模的数据存储到成百上千的计算机中------为了解决数据管理以及维护极其繁琐与低效------>分布式文件系统 分布式文件系统是管理网络中跨多台计算机…

基于SSM框架的狼途汽车门店管理系统的设计与实现

基于SSM框架的狼途汽车门店管理系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、…

AutoCAD学习之基本操作学习笔记

AutoCAD学习 基本操作&#xff08;23.2.15~23.2.17&#xff09; CtrlN 新建一个CAD文档F7 删除格栅F3 对象捕捉&#xff08;很重要啊&#xff0c;如果一直开着&#xff0c;操作起来很费劲。&#xff09;&#xff0c;需要关掉&#xff0c;注意使用snipaste&#xff0c;会不停地…

QT 文件监视系统QFileSystemWatcher监视目录的改变directoryChanged和监视文件的改变fileChanged

QT 文件监视系统QFileSystemWatcher监视目录的改变相关操作说明mainwindow.hmainwindow.cpp调试结果相关操作说明 添加头文件 Header: #include qmake: QT core bool QFileSystemWatcher::addPath(const QString &path)如果路径存在&#xff0c;则会向文件系统监视器添…