QtWebkit: Как проверить код статуса HTTP? - PullRequest
10 голосов
/ 02 декабря 2010

Я пишу генератор миниатюр согласно примеру в документации QtWebkit .Я хотел бы избежать скриншотов страниц ошибок, таких как 404 not found или 503 Internal server error.

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

Ответы [ 2 ]

15 голосов
/ 02 декабря 2010

Оказывается, вам нужно отслеживать QNetworkAccessManager , связанный с вашим QWebPage, и ждать сигнала закончен (...) . Затем вы можете проверить 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.

2 голосов
/ 10 декабря 2012

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

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;
}
...