2010-12-01 2 views
9

Я пишу миниатюру в соответствии с an example in the QtWebkit documentation. Я хотел бы избежать скриншотов страниц с ошибками, таких как 404 not found или 503 Internal server error.QtWebkit: Как проверить код состояния HTTP?

Однако сигнал QWebPage::loadFinished() всегда излучается ok = true, даже если страница дает сообщение об ошибке HTTP. Есть ли способ в QtWebkit проверить код состояния HTTP на ответ?

ответ

14

Оказывается, вам необходимо следить за QNetworkAccessManager, связанным с вашим QWebPage, и ждать сигнала finished(...). Затем вы можете проверить ответ HTTP и проверить его код состояния, запросив атрибут QNetworkRequest::HttpStatusCodeAttribute.

Это лучше объяснить в коде:

void MyClass::initWebPage() 
{ 
    myQWebPage = new QWebPage(this); 
    connect(
    myQWebPage->networkAccessManager(), SIGNAL(finished(QNetworkReply *)), 
    this, SLOT(httpResponseFinished(QNetworkReply *)) 
); 
} 

void MyClass::httpResponseFinished(QNetworkReply * reply) 
{ 
    switch (reply->error()) 
    { 
    case QNetworkReply::NoError: 
     // No error 
     return; 
    case QNetworkReply::ContentNotFoundError: 
     // 404 Not found 
     failedUrl = reply->request.url(); 
     httpStatus = reply->attribute(
     QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
     httpStatusMessage = reply->attribute(
     QNetworkRequest::HttpReasonPhraseAttribute).toByteArray(); 
     break; 
    } 
} 

Есть еще NetworkErrors, чтобы выбрать из, например, для ошибок TCP или HTTP 401.

+5

FWIW, можно также запросить код состояния HTTP непосредственно QNetworkReply :: Attribute и QNetworkRequest :: HttpStatusCodeAttribute см Http:. //doc.qt .nokia.com/4,7-снимок/qnetworkreply.html атрибут #. – Macke 2011-12-13 15:24:18

2

Это то, что я использую в проекте портирования. Он проверяет ответ и решает начать отмену запроса или нет. Отступать часть находится в стадии разработки, но я оставил комментарии в

QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender()); 
Q_CHECK_PTR(reply); 

QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); 
if (!statusCode.isNull() && statusCode.toInt() >= 400){ 
    //INVALID_SERVER_RESPONSE_BACKOFF; 
    qDebug() << "server returned invalid response." << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); 
    return; 
}else if (!statusCode.isNull() && statusCode.toInt() != 200){ 
    //INVALID_SERVER_RESPONSE_NOBACKOFF; 
    qDebug() << "server returned invalid response." << reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); 
    return; 
}