Как получить первое событие перенаправления (301 или 302) в QtWebKit - PullRequest
6 голосов
/ 01 марта 2012

мы используем QtWebKit 4.7 и хотим знать, когда загрузка кадра выполняет перенаправление.

На данный момент мы считаем исходящие запросы в подклассе QNetworkAccessManager, где перезаписываем createRequest.

В большинстве случаев работает нормально, но когда первый ответ 301 или 302 (перенаправление), он где-то проглатывается.

Мы просто запрашиваем URL следующим образом:

QNetworkRequest request(QUrl("http://www.twitter.com")); // 301 to twitter.com
frame->load(request);

Ответы [ 2 ]

8 голосов
/ 01 марта 2012

Обработайте QNetworkReply самостоятельно, получите код состояния из ответа и выполните QWebFrame :: setcontent.

QNetworkRequest request(QUrl("http://www.twitter.com")); // 301 to twitter.com
connect (frame->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*), this, SLOT(onFinished(QNetworkReply*));
frame->page()->networkAccessManager()->get(request);

[...]

void onFinished(QNetworkReply* reply)
{
    if (reply->error() == QNetworkReply::NoError) {
        int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        switch (statusCode) {
            case 301:
            case 302:
            case 307:
                qDebug() << "redirected: " << reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
                break;

            case 200:
                frame->setContent(reply->readAll());
                break;
        }
    }
}
3 голосов
/ 01 марта 2012

Используйте сигнал void QWebFrame::urlChanged ( const QUrl & url ) для обнаружения изменений URL, то есть перенаправления, т.е.

QNetworkRequest request(QUrl("http://www.twitter.com")); // 301 to twitter.com
connect(frame, SIGNAL(urlChanged (const QUrl&)), this, SLOT(onRedirected(const QUrl&));
frame->load(request);
...