0、说明
QNetworkAccessManager允许应用发送Request并接受回应。
网络访问API是围绕一个QNetworkAccessManager对象构建的,该对象保留了所有它发送的请求的配置和设置项。其中包含代理、cache配置、相关的信号、监控网络运行的回应信号。
一个QNetworkAccessManager实例对于整个Qt应用已经足够了。因为QNetworkAccessManager是基于QObject构建的,它只能被它所属的线程使用。
一旦一个QNetworkAccessManager对象被构造了,应用程序就会用它发送Request。之后会收到一个QNetworkReply对象作为响应,该对象包含了该Request对应的Response中所有的数据。
一个简单的网络下载代码如下:
QNetworkAccessManager * manager = new QNetworkAccessManager(this); connect(manager,&QNetworkAccessManager::finished,this,&MyClass::replyFinished); manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
QNetworkAccessManager有一个异步API。本例中调用了replyFinished槽,这个槽函数接收一个QNetworkReply作为参数,该参数包含了下载数据。
注意
Request完成后,我们需要在适当时间删除QNetworkReply对象,不要直接在与信号finished()关联的槽函数直接删除这个Request,我们可以用deleteLater()函数。
QNetworkAccessManager会给它收到的Requests设置一个队列。Request数取决于具体协议。现在,对于一个桌面平台上的HTTP协议,对于同一个Host/Port组合并行执行6个requests。
一个更常见的例子,假设Manager已经存在了,那么:
QNetworkRequest request; request.setUrl(QUrl("http://qt-project.org")); request.setRawHeader("User-Agent", "MyOwnBrowser 1.0"); QNetworkReply *reply = manager->get(request); connect(reply, &QIODevice::readyRead, this, &MyClass::slotReadyRead); connect(reply, &QNetworkReply::errorOccurred,this, &MyClass::slotError); connect(reply, &QNetworkReply::sslErrors,this, &MyClass::slotSslErrors);
1、模块和加载项
Header: | #include <QNetworkAccessManager> |
qmake: | QT += network |
Since: | Qt 4.4 |
Inherits: | QObject |
2、构造
QNetworkAccessManager(QObject *parent = nullptr) | 构造一个Manager作为当前网络访问API的中心,并设置它的parent |
3、静态字段
类型 |
字段 |
取值 |
说明 |
enum | Operation |
{ HeadOperation, GetOperation, PutOperation, PostOperation, DeleteOperation, CustomOperation } |
标识该响应处理的是哪种操作 |
Constant | Value | Description |
---|---|---|
QNetworkAccessManager::HeadOperation |
1 |
retrieve headers operation (created with head()) |
QNetworkAccessManager::GetOperation |
2 |
retrieve headers and download contents (created with get()) |
QNetworkAccessManager::PutOperation |
3 |
upload contents operation (created with put()) |
QNetworkAccessManager::PostOperation |
4 |
send the contents of an HTML form for processing via HTTP POST (created with post()) |
QNetworkAccessManager::DeleteOperation |
5 |
delete contents operation (created with deleteResource()) |
QNetworkAccessManager::CustomOperation |
6 |
custom operation (created with sendCustomRequest()) |
4、实例方法
返回值类型 |
方法 |
说明 |
void | addStrictTransportSecurityHosts(QVector<QHstsPolicy> knownHosts) | 在HSTS cache中添加HTTP传输加密策略。 |
bool | autoDeleteReplies() | 如果当前Manager会自动删除Reply,返回true |
QAbstractNetworkCache * | cache() | 返回该Network的cache |
void | clearAccessCache() |
清空有关认证数据和网络连接的缓冲区。 在进行自动测试时很有用。 |
void | clearConnectionCache() | 清空有关网络连接的缓冲区,但是认证数据会被保留 |
void | connectToHost(QString hostName, quint16 port = 80) |
初始化到给定Host的连接。 常用于在HTTP请求前,完成一个到Host的TCP握手。 该方法不会报错。 |
void |
connectToHostEncrypted(QString hostName, quint16 port = 443, QSslConfiguration sslConfiguration = QSslConfiguration::defaultConfiguration()) connectToHostEncrypted(QString hostName, quint16 port, QSslConfiguration sslConfiguration, QString peerName) |
采用SSL配置连接到给定Host和Port。常用于在HTTPS请求前完成到一个Host的TCP和SSL握手。 |
QNetworkCookieJar * | cookieJar() | 返回存储cookie的CookieJar |
QNetworkReply * | deleteResource(QNetworkRequest request) |
发送Request来删除请求该URL的相关资源。 只用于HTTP协议,代表一个HTTP DELETE请求。 |
void | enableStrictTransportSecurityStore(bool enabled, QString storeDir = QString()) | |
QNetworkReply * | get(QNetworkRequest request) | 发送get请求,返回Reply。 |
QNetworkReply * | head(QNetworkRequest request) | 发送一个请求header的Request,返回的Reply将包含这些header。 |
bool | isStrictTransportSecurityEnabled() | 如果启动HSTS,则返回true |
bool | isStrictTransportSecurityStoreEnabled() | 如果HSTS cache永久存储HSTS协议,就返回true |
QNetworkReply * |
post(QNetworkRequest request, QIODevice *data) post(QNetworkRequest request, QByteArray data) post(QNetworkRequest request, QHttpMultiPart *multiPart) |
发送HTTP Post请求。 |
QNetworkProxy | proxy() | 返回该Manager发送Request时用的代理 |
QNetworkProxyFactory * | proxyFactory() | 代理因素 |
QNetworkReply * |
put(QNetworkRequest request, QIODevice *data) put(QNetworkRequest request, QByteArray data) put(QNetworkRequest request, QHttpMultiPart *multiPart) |
发送HTTP Put请求。 |
QNetworkRequest::RedirectPolicy | redirectPolicy() | 重定向策略。 |
void |
sendCustomRequest(QNetworkRequest request, QByteArray verb, QIODevice *data = nullptr) sendCustomRequest(QNetworkRequest request, QByteArray verb, QByteArray data) sendCustomRequest(QNetworkRequest request, QByteArray verb, QHttpMultiPart *multiPart) |
发送Reuqest。 |
void |
setAutoDeleteReplies(bool shouldAutoDelete) setCache(QAbstractNetworkCache *cache) setCookieJar(QNetworkCookieJar *cookieJar) setProxy(QNetworkProxy proxy) setProxyFactory(QNetworkProxyFactory *factory) setRedirectPolicy(QNetworkRequest::RedirectPolicy policy) setStrictTransportSecurityEnabled(bool enabled) setTransferTimeout(int timeout = QNetworkRequest::DefaultTransferTimeoutConstant) |
一些设置项 |
QVector<QHstsPolicy> | strictTransportSecurityHosts() | 返回HSTS协议列表 |
QStringList | supportedSchemes() | 列出Manager支持的全部URL模式。 |
int | transferTimeout() | 传输超时时间。 |
5、信号
信号 |
说明 |
authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) | 当一个Request发送前如果需要认证就发射该信号。槽函数中需要完成对认证信息的填充。 |
encrypted(QNetworkReply *reply) | 当SSL/TLS会话顺利完成第一次握手后发送该信号。 |
finished(QNetworkReply *reply) | 当完成一次Reply时发送该信号。 |
preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator) | |
proxyAuthenticationRequired(QNetworkProxy proxy, QAuthenticator *authenticator) | |
sslErrors(QNetworkReply *reply, QList<QSslError> errors) |
6、一些简写
HSTS | HTTP Strict Transport Security | 严格传输安全协议 |