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);
Header:
#include
qmake:
QT += network
Since:
Qt 4.4
Inherits:
QNetworkAccessManager(QObject *_parent_ = nullptr)
构造一个Manager用于当前网络访问API的核心,并设置它所属的Parent Widget
enum
{ 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())
void
addStrictTransportSecurityHosts(QVector
在HSTS cache中添加HTTP传输加密策略。
bool
如果当前Manager会自动删除Reply,返回true
QAbstractNetworkCache *
cache()
返回该Network的cache
void
清空有关认证数据和网络连接的缓冲区。
在进行自动测试时很有用。
void
清空有关网络连接的缓冲区,但是认证数据会被保留
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 *
返回存储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 *
代理因素
QNetworkReply *
put(QNetworkRequest request, QIODevice *_data_)
put(QNetworkRequest request, QByteArray data)
put(QNetworkRequest request, QHttpMultiPart *_multiPart_)
发送HTTP Put请求。
QNetworkRequest::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
strictTransportSecurityHosts()
返回HSTS协议列表
QStringList
列出Manager支持的全部URL模式。
int
传输超时时间。
authenticationRequired(QNetworkReply *_reply_, QAuthenticator *_authenticator_)
当一个Request发送前如果需要认证就发射该信号。槽函数中需要完成对认证信息的填充。
encrypted(QNetworkReply *_reply_)
当SSL/TLS会话顺利完成第一次握手后发送该信号。
finished(QNetworkReply *_reply_)
当发送Request并收到Reply时发送该信号。
preSharedKeyAuthenticationRequired(QNetworkReply *_reply_, QSslPreSharedKeyAuthenticator *_authenticator_)
proxyAuthenticationRequired(QNetworkProxy proxy, QAuthenticator *_authenticator_)
sslErrors(QNetworkReply *_reply_, QList
HSTS
HTTP Strict Transport Security
严格传输安全协议
由于会发送请求,收到Reply时会发送&QNetworkRequest::finished()信号,所以把该信号与某个槽函数关联,这样发送请求并收到Reply后可以在该槽函数中说明如何处理Reply。
QNetworkRequest request;//构造空Request
request.setUrl(QUrl("url_string"));//设置该Request欲请求的URL
//构造Manager,用于发送Request,构造时必须指定参数Parent
//即它所属的父Widget,比如一个Widget或一个Dialog
QNetworkAccessManager * manager = new QNetworkAccessManager(this);
//发送GET请求,并收到了reply之后,Manager会发送finished信号
//将这个信号与某个槽连接,以处理它的reply
manager.get(request);
connect(manager,&NetworkAccessManager::finished(),[=](QNetworkReply * reply){
if(reply && reply->error()==QNetworkReply::NoError){
//reply是QIODevice的子类,所以可以用QIODevice的各种读取函数
QByteArray data = reply->readAll();//一次读取全部,写为二进制数据
//…对data的后续处理
}
});
手机扫一扫
移动阅读更方便
你可能感兴趣的文章