QtWebkitドキュメントの例に従ってサムネイルジェネレータを作成しています。404 not found
またはなどのエラーページのスクリーンショットは避けたい503 Internal server error
です。
ただし、QWebPage :: loadFinished()シグナルはok = true
、ページでHTTPエラーが発生した場合でも常に発行されます。QtWebkitに応答のHTTPステータスコードをチェックする方法はありますか?
QtWebkitドキュメントの例に従ってサムネイルジェネレータを作成しています。404 not found
またはなどのエラーページのスクリーンショットは避けたい503 Internal server error
です。
ただし、QWebPage :: loadFinished()シグナルはok = true
、ページでHTTPエラーが発生した場合でも常に発行されます。QtWebkitに応答のHTTPステータスコードをチェックする方法はありますか?
QWebPageに関連付けられているQNetworkAccessManagerを監視し、 finished(...)シグナルを待つ必要があることがわかりました。QNetworkRequest::HttpStatusCodeAttribute
次に、属性を要求することにより、HTTP応答を検査し、そのステータスコードを確認できます。
それはコードでよりよく説明されています:
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;
}
}
TCPエラーやHTTP401など、選択できるNetworkErrorは他にもあります。
これは私が移植プロジェクトで使用しているものです。返信を確認し、リクエストのバックオフを開始するかどうかを決定します。バックオフ部分は進行中ですが、コメントを残しました。
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;
}