Qtwebkit: Как проверить код состояния HTTP?
-
30-09-2019 - |
Вопрос
Я пишу генератор миниатюр в соответствии с Пример в документации 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;
}