Как вернуть логическое значение для перенаправления QUrl или нет? - PullRequest
0 голосов
/ 13 февраля 2019

Я играл с этим, и я не могу полностью следовать логике перенаправлений в qt.На самом деле, все, что я хотел бы сделать, это создать такую ​​функцию:

bool MyClass::isRedirect(const QUrl &url)
{
        return QUrl(m_NetworkAccessManager.get(QNetworkRequest(url))
        ->header(QNetworkRequest::LocationHeader).toString()).toString()
        != url.toString();
}

И для подтверждения концепции я хотел бы сделать это с помощью этого URL:

https://en.wikipedia.org/wiki/Vario-Tessar

Следует перенаправить на:

https://en.wikipedia.org/wiki/Tessar#Vario-Tessar

Я полагаю, что это должно быть действительно легко, но ответ уклоняетсямне.Я попытался ввести URL-адрес и проверить ответ на наличие заголовка, указывающего на перенаправление, но ничего не пришло.Чтение документации ... мне потребовался цикл, поскольку я не мог понять, должен ли я установить атрибут для QNetworkReply, QNetworkRequest или самого QNetworkAccessManager для разрешения перенаправлений, а затем после этого,создание логического значения.

Я также не уверен, что все перенаправления одинаковы, или если некоторые страницы реализуют его по-разному, имея скрипт, запускаемый после загрузки страницы, например:

https://en.wikipedia.org/w/index.php?title=Vario%20Tessar&action=edit

Если бы я действительно хотел, я мог бы использовать QWebEngineView для загрузки и просто сравнивать до и после URL, но это кажется немного здоровенным.Я просто хочу самый простой способ выполнить эту функцию выше.

Спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

Я настоятельно рекомендую посмотреть код состояния http ответа следующим образом:

int http_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

В вашем примере это 200 (ОК), т.е.перенаправления нет вообще.

В любом случае, если вы вызываете

http://en.wikipedia.org/wiki/Vario-Tessar

(обратите внимание на отсутствие s в имени протокола) перенаправлениебудет происходить.

Учитывая, что менеджер и / или запрос используют политику перенаправления по умолчанию (QNetworkRequest::ManualRedirectPolicy), ответ будет иметь код состояния 301 , на этот раз, инет данных.Более того, вы можете проверить цель перенаправления:

int code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
static QVector<int> redirectCodes{301, 302, 303, 305, 307, 308};
if(redirectCodes.contains(code))
{
    QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
    //...

На этом этапе вы можете начать новый запрос, используя цель перенаправления, или вообще прервать транзакцию, или как вам подсказывает ваша личная политика перенаправления.

Если вы просто не хотите заниматься перенаправлением вообще, вы можете установить другую политику на уровне менеджера, используя QNetworkAccessManager::setRedirectPolicy, или на уровне запроса, используя QNetworkRequest::setAttribute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...