Вопрос

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

Однако Qwebpage :: Loadfined () Сигнал всегда испускается ok = true Даже когда страница дает ошибку HTTP. Есть ли путь в Qtwebkit, чтобы проверить код состояния HTTP в ответ?

Это было полезно?

Решение

Оказывается, вам нужно отслеживать 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.

Другие советы

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

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top