Russian Qt Forum

Qt => Работа с сетью => Тема начата: Paramon от Февраль 17, 2015, 13:25



Название: QNetworkAccessManager проблема с редиректом
Отправлено: Paramon от Февраль 17, 2015, 13:25
Собственно делаю запрос к сайту, он возвращает код 302 и ссылку в location - "/". При попытке пройти по этой "ссылке" QNetworkReply естественно возвращает ошибку что нету такого протокола "" (т.е. пусто).
Есть ли способ обойтись малой кровью, или в таком случае нужно брать последний URL, парсить домен и добавлять к нему location?


Название: Re: QNetworkAccessManager проблема с редиректом
Отправлено: Alex Custov от Февраль 17, 2015, 13:37
или в таком случае нужно брать последний URL, парсить домен и добавлять к нему location?

Да. Location может быть относительным, поэтому полный путь нового URL ты должен составить сам


Название: Re: QNetworkAccessManager проблема с редиректом
Отправлено: Paramon от Февраль 17, 2015, 16:27
Как-то вот так получилось.  :)
Код:
    QVariant iRedirectState=networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if(iRedirectState==301 || iRedirectState==302)
    {
        QString redirectURL=networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toString();
        if(redirectURL.left(4).toLower()!="http")
        {
            redirectURL.insert(0,networkRequest.url().scheme().toLower()+"://"+networkRequest.url().host());
        }
        networkRequest.setUrl(QUrl(redirectURL));
    }

Да, как-то пропустил, что вероятно всё это можно указать в QUrl без преобразований в QString и обратно. На скорую руку.


Название: Re: QNetworkAccessManager проблема с редиректом
Отправлено: Paramon от Февраль 17, 2015, 16:33
Так наверное правильнее
Код:
    QVariant iRedirectState=networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if(iRedirectState==301 || iRedirectState==302)
    {
        QUrl redirectTo = networkReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
        if(redirectTo.scheme().isEmpty())
        {
            redirectTo.setScheme(networkRequest.url().scheme());
            redirectTo.setHost(networkRequest.url().host());
        }
        networkRequest.setUrl(redirectTo);
    }