1.详细描述

QNetworkReply类包含了用QNetworkAccessManager发送的请求的数据和头信息。 QNetworkReply类包含了与QNetworkAccessManager发布的请求相关的数据和元数据。像QNetworkRequest一样,它包含一个URL和头信息(包括解析过的和原始的形式),一些关于回复状态的信息和回复本身的内容。 QNetworkReply是一个顺序访问的QIODevice,这意味着一旦从该对象中读取数据,就不再由该设备保存。因此,如果需要的话,保留这些数据是应用程序的责任。每当从网络上收到更多的数据并进行处理时,就会发出readyRead()信号。 当收到数据时,也会发出downloadProgress()信号,但其中包含的字节数可能不代表实际收到的字节数,如果对内容做了任何转换(例如解压和移除协议开销)。 即使QNetworkReply是一个与回复内容相连的QIODevice,它也会发出uploadProgress()信号,表示有这种内容的操作的上传进度。 注意:不要删除连接到error()或finished()信号的槽中的对象。使用deleteLater()。 另见QNetworkRequest和QNetworkAccessManager。

2.成员类型说明

enum QNetworkReply::NetworkError

表示在处理请求的过程中发现的所有可能的错误情况。

Constant

Value

Description

QNetworkReply::NoError

0

no error condition.

注意:当HTTP协议返回一个重定向时,不会报告错误。你可以用QNetworkRequest::RedirectionTargetAttribute属性检查是否有重定向。

Constant

Value

Description

QNetworkReply::ConnectionRefusedError

1

the remote server refused the connection (the server is not accepting requests)

QNetworkReply::RemoteHostClosedError

2

the remote server closed the connection prematurely, before the entire reply was received and processed

QNetworkReply::HostNotFoundError

3

the remote host name was not found (invalid hostname)

QNetworkReply::TimeoutError

4

the connection to the remote server timed out

QNetworkReply::OperationCanceledError

5

the operation was canceled via calls to abort() or close() before it was finished.

QNetworkReply::SslHandshakeFailedError

6

the SSL/TLS handshake failed and the encrypted channel could not be established. The sslErrors() signal should have been emitted.

QNetworkReply::TemporaryNetworkFailureError

7

the connection was broken due to disconnection from the network, however the system has initiated roaming to another access point. The request should be resubmitted and will be processed as soon as the connection is re-established.

QNetworkReply::NetworkSessionFailedError

8

the connection was broken due to disconnection from the network or failure to start the network.

QNetworkReply::BackgroundRequestNotAllowedError

9

the background request is not currently allowed due to platform policy.

QNetworkReply::TooManyRedirectsError

10

while following redirects, the maximum limit was reached. The limit is by default set to 50 or as set by QNetworkRequest::setMaxRedirectsAllowed(). (This value was introduced in 5.6.)

QNetworkReply::InsecureRedirectError

11

while following redirects, the network access API detected a redirect from a encrypted protocol (https) to an unencrypted one (http). (This value was introduced in 5.6.)

QNetworkReply::ProxyConnectionRefusedError

101

the connection to the proxy server was refused (the proxy server is not accepting requests)

QNetworkReply::ProxyConnectionClosedError

102

the proxy server closed the connection prematurely, before the entire reply was received and processed

QNetworkReply::ProxyNotFoundError

103

the proxy host name was not found (invalid proxy hostname)

QNetworkReply::ProxyTimeoutError

104

the connection to the proxy timed out or the proxy did not reply in time to the request sent

QNetworkReply::ProxyAuthenticationRequiredError

105

the proxy requires authentication in order to honour the request but did not accept any credentials offered (if any)

QNetworkReply::ContentAccessDenied

201

the access to the remote content was denied (similar to HTTP error 403)

QNetworkReply::ContentOperationNotPermittedError

202

the operation requested on the remote content is not permitted

QNetworkReply::ContentNotFoundError

203

the remote content was not found at the server (similar to HTTP error 404)

QNetworkReply::AuthenticationRequiredError

204

the remote server requires authentication to serve the content but the credentials provided were not accepted (if any)

QNetworkReply::ContentReSendError

205

the request needed to be sent again, but this failed for example because the upload data could not be read a second time.

QNetworkReply::ContentConflictError

206

the request could not be completed due to a conflict with the current state of the resource.

QNetworkReply::ContentGoneError

207

the requested resource is no longer available at the server.

QNetworkReply::InternalServerError

401

the server encountered an unexpected condition which prevented it from fulfilling the request.

QNetworkReply::OperationNotImplementedError

402

the server does not support the functionality required to fulfill the request.

QNetworkReply::ServiceUnavailableError

403

the server is unable to handle the request at this time.

QNetworkReply::ProtocolUnknownError

301

the Network Access API cannot honor the request because the protocol is not known

QNetworkReply::ProtocolInvalidOperationError

302

the requested operation is invalid for this protocol

QNetworkReply::UnknownNetworkError

99

an unknown network-related error was detected

QNetworkReply::UnknownProxyError

199

an unknown proxy-related error was detected

QNetworkReply::UnknownContentError

299

an unknown error related to the remote content was detected

QNetworkReply::ProtocolFailure

399

a breakdown in protocol was detected (parsing error, invalid or unexpected responses, etc.)

QNetworkReply::UnknownServerError

499

an unknown error related to the server response was detected

参见 error().

typedef QNetworkReply::RawHeaderPair

RawHeaderPair是一个QPair<QByteArray, QByteArray>,其中第一个QByteArray是头的名称,第二个是头。

3.成员函数说明

[protected] QNetworkReply::QNetworkReply(QObject parent* = Q_NULLPTR)**

创建一个带有父类的QNetworkReply对象。 你不能直接实例化QNetworkReply对象。使用QNetworkAccessManager函数来实现。

QNetworkReply::~QNetworkReply()

处置此回复并释放与之相关的任何资源。如果有任何网络连接仍然开放,它们将被关闭。 也请参见abort()和close()。

[pure virtual slot] void QNetworkReply::abort()

立即中止操作,并关闭任何仍然开放的网络连接。仍然在进行中的上传也被终止。 finished()信号也将被发射出来。 也请参见close()和finished()。

QVariant QNetworkReply::attribute(QNetworkRequest::Attribute code) const

返回与代码编码相关的属性。如果该属性没有被设置,它将返回一个无效的QVariant(类型为QMetaType::UnknownType)。 你可以期待QNetworkRequest::Attribute中列出的默认值被应用于这个函数返回的值。 参见 setAttribute() 和 QNetworkRequest::Attribute。

[virtual] void QNetworkReply::close()

从QIODevice::close()重新实现。 关闭这个设备的读取。未读的数据被丢弃,但网络资源在完成之前不会被丢弃。特别是,如果任何上传正在进行中,它将继续进行,直到完成。 当所有操作结束,网络资源被释放时,就会发出 finished()信号。 也请参见abort()和finished()。

[signal] void QNetworkReply::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)

这个信号是用来指示这个网络请求的下载部分的进度,如果有的话。如果没有与此请求相关的下载,这个信号将被发射一次,bytesReceived和bytesTotal的值都为0。 bytesReceived参数表示收到的字节数,而bytesTotal表示预计下载的总字节数。如果不知道要下载的字节数,bytesTotal将是-1。 当bytesReceived等于bytesTotal时,下载就结束了。那时,bytesTotal将不再是-1。 请注意,bytesReceived和bytesTotal的值可能与size()、通过read()或readAll()获得的字节总数、或header(ContentLengthHeader)的值不同。原因是在下载过程中可能有协议开销或数据被压缩。 参见uploadProgress()和byteAvailable()。

[signal] void QNetworkReply::encrypted()

当一个SSL/TLS会话成功地完成了初始握手,这个信号就会发出。在这一点上,没有用户数据被传输。该信号可用于对证书链进行额外的检查,例如,当网站的证书发生变化时通知用户。如果回复不符合预期的标准,那么应该通过调用QNetworkReply::abort()由连接到这个信号的槽来中止它。使用中的SSL配置可以通过QNetworkReply::sslConfiguration()方法进行检查。 在内部,QNetworkAccessManager可以打开多个连接到一个服务器,以允许它并行地处理请求。这些连接可以被重复使用,这意味着加密()信号将不会被发射出来。这意味着,在QNetworkAccessManager的生命周期中,你只能保证在第一次连接到一个站点时收到这个信号。 这个函数是在Qt 5.1中引入的。 参见QSslSocket::encrypted() 和 QNetworkAccessManager::encrypted()。

NetworkError QNetworkReply::error() const

返回在处理此请求时发现的错误。如果没有发现错误,则返回NoError。 也请看setError()。

[signal] void QNetworkReply::error(QNetworkReply::NetworkError code)

当回复在处理过程中检测到一个错误时,这个信号会被发出。finished()信号可能会紧随其后,表明连接已经结束。 code参数包含检测到的错误代码。调用errorString()来获得错误情况的文本表示。 注意:不要删除连接到这个信号的槽中的对象。使用deleteLater()。 注意:错误信号在这个类中被重载。要使用函数指针语法连接到这个,你必须在静态转换中指定信号类型,如本例所示:

connect(networkReply, static_cast<void(QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
      [=](QNetworkReply::NetworkError code){ /* ... */ });
也见error()和errorString()。

[signal] void QNetworkReply::finished()

这个信号在回复完成处理时被发出来。在这个信号发出后,回复的数据或元数据将不再有更新。 除非close()或abort()被调用,否则回复仍将被打开以供阅读,所以数据可以通过调用read()或readAll()来检索。特别是,如果没有因为readyRead()的结果而调用read(),调用readAll()将检索QByteArray中的全部内容。 这个信号与QNetworkAccessManager::finished()同时发出,该信号的回复参数是这个对象。 注意:不要删除连接到这个信号的槽中的对象。请使用deleteLater()。 你也可以使用isFinished()来检查一个QNetworkReply是否已经完成,甚至在你收到finish()信号之前。 参见setFinished(), QNetworkAccessManager::finished(), and isFinished()。

bool QNetworkReply::hasRawHeader(const QByteArray &headerName) const

如果远程服务器发送了名称为headerName的原始头信息,则返回true。 参见rawHeader()。

QVariant QNetworkReply::header(QNetworkRequest::KnownHeaders header) const

返回已知头信息的值,如果该头信息是由远程服务器发送的。如果头信息没有被发送,则返回一个无效的QVariant。 参见rawHeader(), setHeader(), 和QNetworkRequest::header()。

[virtual slot] void QNetworkReply::ignoreSslErrors()

如果调用此函数,与网络连接有关的SSL错误将被忽略,包括证书验证错误。 警告。请确保总是让用户检查由sslErrors()信号报告的错误,并且只有在用户确认继续进行时才调用此方法。如果有意外的错误,应该中止回复。在没有检查实际错误的情况下调用这个方法,很可能会给你的应用程序带来安全风险。使用它时要非常小心! 这个函数可以从连接到sslErrors()信号的槽中调用,这表明发现了哪些错误。 注意:如果QNetworkAccessManager启用了HTTP严格传输安全,这个函数就没有作用。 参见sslConfiguration(), sslErrors(), 和QSslSocket::ignoreSslErrors()。

void QNetworkReply::ignoreSslErrors(const QList<QSslError> &errors)

这是一个重载函数。 如果这个函数被调用,errors中给出的SSL错误将被忽略。 注意:由于大多数SSL错误都与证书有关,对于大多数错误,你必须设置这个SSL错误所涉及的预期证书。例如,如果你想向一个使用自签名证书的服务器发出请求,可以考虑下面的片段:

QList<QSslCertificate> cert = QSslCertificate::fromPath(QLatin1String("server-certificate.pem"));
  QSslError error(QSslError::SelfSignedCertificate, cert.at(0));
  QList<QSslError> expectedSslErrors;
  expectedSslErrors.append(error);

  QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("https://server.tld/index.html")));
  reply->ignoreSslErrors(expectedSslErrors);
  // here connect signals etc.
多次调用此函数将替换之前调用时传递的错误列表。你可以用一个空的列表调用这个函数来清除你想忽略的错误列表。 注意:如果QNetworkAccessManager启用了HTTP严格传输安全,这个函数就没有作用。 这个函数在Qt 4.6中引入。 参见sslConfiguration(), sslErrors(), QSslSocket::ignoreSslErrors(), and QNetworkAccessManager::setStrictTransportSecurityEnabled()。

[virtual protected] void QNetworkReply::ignoreSslErrorsImplementation(const QList<QSslError> &errors)

这个虚拟方法的提供是为了能够覆盖ignoreSslErrors()的行为。ignoreSslErrors()是这个方法的一个公共包装。 errors包含用户希望忽略的错误。 这个函数是在Qt 5.0中引入的。 参见ignoreSslErrors()。

bool QNetworkReply::isFinished() const

当回复已经完成或被中止时,返回true。 这个函数在Qt 4.6中引入。 也请看isRunning()。

bool QNetworkReply::isRunning() const

当请求仍在处理中,并且回复还没有完成或被中止时,返回true。 这个函数在Qt 4.6中引入。 也请看isFinished()。

QNetworkAccessManager *QNetworkReply::manager() const

返回用于创建此QNetworkReply对象的QNetworkAccessManager。最初,它也是父对象。

[signal] void QNetworkReply::metaDataChanged()

每当这个回复中的元数据发生变化时,就会发出这个信号。元数据是任何不属于内容(数据)本身的信息,包括网络头文件。在大多数情况下,在收到第一个字节的数据时,元数据将被完全知道。然而,在数据的处理过程中,有可能收到头信息或其他元数据的更新。 参见header(), rawHeaderList(), rawHeader(), and hasRawHeader()。

QNetworkAccessManager::Operation QNetworkReply::operation() const

返回为这个回复发布的操作。 也请参见setOperation()。

[signal] void QNetworkReply::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator authenticator*)**

如果SSL/TLS握手协商了一个PSK密码组,因此需要一个PSK认证,那么这个信号就会被发射出来。 当使用PSK时,客户端必须向服务器发送一个有效的身份和一个有效的预共享密钥,以便SSL握手继续进行。应用程序可以在与该信号相连的槽中提供这些信息,根据他们的需要填写传递的认证器对象。 注意:忽视这个信号,或未能提供所需的证书,将导致握手失败,从而导致连接被中止。 注意:认证器对象为回复所拥有,应用程序不得删除。 这个函数是在Qt 5.5中引入的。 也请参见QSslPreSharedKeyAuthenticator。

QByteArray QNetworkReply::rawHeader(const QByteArray &headerName) const

返回远程服务器发送的头信息headerName的原始内容。如果没有这样的头,则返回一个空的字节数组,这可能与空的头无法区分。使用hasRawHeader()来验证服务器是否发送了这样的头域。 参见setRawHeader(), hasRawHeader(), and header()。

QList<QByteArray> QNetworkReply::rawHeaderList() const

返回由远程服务器发送的标题字段的列表,按照它们被发送的顺序。重复的头信息会被合并在一起,并取代后一个重复的头信息。

const QList<RawHeaderPair> &QNetworkReply::rawHeaderPairs() const

返回一个原始头文件对的列表。

qint64 QNetworkReply::readBufferSize() const

返回读取缓冲区的大小,单位是字节。 也请参见setReadBufferSize()。

[signal] void QNetworkReply::redirectAllowed()

当处理redirected()信号的客户端代码验证了新的URL后,它发出这个信号以允许重定向继续进行。该协议适用于重定向策略被设置为QNetworkRequest::UserVerifiedRedirectsPolicy的网络请求。 这个函数在Qt 5.9中被引入。 参见QNetworkRequest::UserVerifiedRedirectPolicy, QNetworkAccessManager::setRedirectPolicy(), 和QNetworkRequest::RedirectPolicyAttribute。

[signal] void QNetworkReply::redirected(const QUrl &url)

如果QNetworkRequest::FollowRedirectsAttribute在请求中被设置,并且服务器以3xx状态(特别是301、302、303、305、307或308状态代码)响应,并且在location头中有一个有效的url,表示HTTP重定向,则发出此信号。url参数包含服务器在location header中返回的新重定向url。 这个函数是在Qt 5.6中引入的。 参见QNetworkRequest::FollowRedirectsAttribute。

QNetworkRequest QNetworkReply::request() const

返回为这个回复所发布的请求。特别注意的是,请求的URL可能与回复的URL不同。 参见QNetworkRequest::url(), url(), and setRequest()。

[protected] void QNetworkReply::setAttribute(QNetworkRequest::Attribute code, const QVariant &value)

设置属性代码,使其具有值。如果code之前被设置过,它将被覆盖。如果value是一个无效的QVariant,该属性将被取消设置。 也请看 attribute() 和 QNetworkRequest::setAttribute()。

[protected] void QNetworkReply::setError(NetworkError errorCode, const QString &errorString)

设置错误条件为errorCode。人工可读的信息用errorString设置。 调用setError()不会发出 error(QNetworkReply::NetworkError) 信号。 也请看error()和errorString()。

[protected] void QNetworkReply::setFinished(bool finished)

将回复设置为完成。 在设置了这个后,回复的数据不能改变。 这个函数在Qt 4.8中引入。 参见 finished() 和 isFinished()。

[protected] void QNetworkReply::setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)

将已知的头信息设置为值。相应的原始形式的头信息也将被设置。 参见header(), setRawHeader(), 和QNetworkRequest::setHeader()。

[protected] void QNetworkReply::setOperation(QNetworkAccessManager::Operation operation)

将此对象的相关操作设置为操作。这个值将由operation()返回。 注意:操作应该在这个对象被创建时设置,并且不能再改变。 也请参见operation()和setRequest()。

[protected] void QNetworkReply::setRawHeader(const QByteArray &headerName, const QByteArray &value)

将原始头信息headerName设置为值。如果headerName之前被设置过,它将被覆盖。多个同名的HTTP头在功能上等同于一个单一的头,其值被连接起来,用逗号分隔。 如果headerName与一个已知的头信息相匹配,其值将被解析,相应的解析后的形式也将被设置。 参见rawHeader(), header(), setHeader(), 和QNetworkRequest::setRawHeader()。

[virtual] void QNetworkReply::setReadBufferSize(qint64 size)

将读取缓冲区的大小设置为大小字节。在用QIODevice::read()读取数据之前,读取缓冲区是保存从网络上下载的数据的缓冲区。将缓冲区的大小设置为0将使缓冲区的大小不受限制。 一旦这个缓冲区满了(即bytesAvailable()返回大小或更大),QNetworkReply将尝试停止从网络上读取数据,从而导致下载也被压缩了。如果缓冲区的大小不受限制,QNetworkReply将尝试尽可能快地从网络上下载。 与QAbstractSocket::setReadBufferSize()不同,QNetworkReply不能保证读取缓冲区大小的精确性。也就是说,bytesAvailable()的返回值可能超过size。 请参阅 readBufferSize()。

[protected] void QNetworkReply::setRequest(const QNetworkRequest &request)

设置此对象的相关请求为request。这个值将由request()返回。 注意:请求应该在这个对象被创建时被设置,并且不再改变。 也请看request()和setOperation()。

void QNetworkReply::setSslConfiguration(const QSslConfiguration &config)

设置与此请求相关的网络连接的SSL配置,如果可能的话,设置为config的配置。 也请看sslConfiguration()。

[virtual protected] void QNetworkReply::setSslConfigurationImplementation(const QSslConfiguration &configuration)

这个虚拟方法的提供是为了能够覆盖setSslConfiguration()的行为。 setSslConfiguration()是这个方法的一个公共包装器。如果你覆盖这个方法,使用配置来设置SSL配置。 这个函数是在Qt 5.0中引入的。 参见sslConfigurationImplementation()和setSslConfiguration()。

[protected] void QNetworkReply::setUrl(const QUrl &url)

设置被处理的URL为url。通常情况下,URL与被发布的请求相匹配,但由于各种原因,它可能是不同的(例如,一个文件路径被做成绝对的或规范的)。 参见url(), request(), 和QNetworkRequest::url()。

QSslConfiguration QNetworkReply::sslConfiguration() const

如果使用了SSL,返回与此回复相关的SSL配置和状态。它将包含远程服务器的证书,其通往证书颁发机构的证书链以及使用的加密密码。 如果发出sslErrors(),对等体的证书及其证书链将在发出的时候被知道。 参见setSslConfiguration()。

[virtual protected] void QNetworkReply::sslConfigurationImplementation(QSslConfiguration &configuration) const

这个虚拟方法的提供是为了能够覆盖sslConfiguration()的行为。sslConfiguration()是这个方法的公共包装器。该配置将在配置中返回。 这个函数在Qt 5.0中引入。 另请参见setSslConfigurationImplementation()和sslConfiguration()。

[signal] void QNetworkReply::sslErrors(const QList<QSslError> &errors)

如果SSL/TLS会话在设置过程中遇到错误,包括证书验证错误,就会发出这个信号。errors参数包含了错误的列表。 为了表示这些错误不是致命的,连接应该继续进行,应该从连接到这个信号的槽中调用ignoreSslErrors()函数。如果不调用它,在任何数据交换(包括URL)之前,SSL会话将被撕毁。 这个信号可以用来向用户显示一个错误信息,表明安全可能受到影响,并显示SSL设置(见sslConfiguration()获取)。如果用户在分析了远程证书后决定继续进行,槽应该调用ignoreSslErrors()。 参见QSslSocket::sslErrors(), QNetworkAccessManager::sslErrors(), sslConfiguration(), and ignoreSslErrors()。

[signal] void QNetworkReply::uploadProgress(qint64 bytesSent, qint64 bytesTotal)

这个信号的发出是为了表明这个网络请求的上传部分的进展,如果有的话。如果没有与此请求相关的上传,这个信号将不会被发出。 bytesSent参数表示上传的字节数,而bytesTotal表示待上传的字节总数。如果不能确定要上传的字节数,bytesTotal将是-1。 当bytesSent等于bytesTotal时,上传就结束了。那时,bytesTotal将不会是-1。 另请参见downloadProgress()。

QUrl QNetworkReply::url() const

返回下载或上传的内容的URL。注意,该URL可能与原始请求的URL不同。如果QNetworkRequest::FollowRedirectsAttribute在请求中被设置,那么这个函数返回网络API正在访问的当前URL,即QNetworkReply::redirected信号中发出的URL。 参见 request(), setUrl(), QNetworkRequest::url(), and redirected()。