Russian Qt Forum

Qt => Работа с сетью => Тема начата: Mr.Visor от Февраль 05, 2013, 18:38



Название: QNetworkAccessManager не обрабатывает перенаправления
Отправлено: Mr.Visor от Февраль 05, 2013, 18:38
Пишу класс для работы с API Tumblr'а. Нужно либо скачать аватар пользователя, либо получить прямую ссылку на него (в действительности, всё сводится к последнему варианту).
В документации (http://www.tumblr.com/docs/en/api/v2#blog-avatar) по API указано, что необходимо использовать URL вида:
api.tumblr.com/v2/blog/mrvisor.tumblr.com/avatar/64 (http://api.tumblr.com/v2/blog/mrvisor.tumblr.com/avatar/64)
и что прямая ссылка на изображение будет передана через поле Location в http-заголовке. Действительно, так и есть (если проверять через, например, bertal.ru (http://www.bertal.ru/index.php?a675106/api.tumblr.com/v2/blog/mrvisor.tumblr.com/avatar/64#h))

Однако... QNetworkAccessManager так совсем не считает!
Что имею (код привожу частично, все необходимые библиотеки подключены):
Код:
void tumblrApi::getAvatar(int size = 64)
{
    QString uri = baseHostname + blogURI + blogHostname + "/avatar/" + QString::number(size);

    connect(httpManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(responseReceived(QNetworkReply*)));
    QNetworkRequest request;
    request.setUrl(QUrl(uri));
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5");
    httpManager->get(request);
}

void tumblrApi::responseReceived(QNetworkReply *reply)
{
    qDebug() << reply->readAll();
    qDebug() << reply->rawHeaderList();
}

на что мне QNetworkReply отвечает предательским молчанием. Никаких заголовков, никаких данных, количество доступных для чтения байт = 0.

Как быть? И куда копать?

P.S. такое ощущение, что перенаправления не обрабатываются вообще (прихожу к этому выводу после теста с url'ом google.com - перенапраления на google.ru не произошло, reply->readAll() вывел мне текст странички с кодом 301 и предложением перейти на google.ru самостоятельно, в Location'е нужного url'а, разумеется, не было).


Название: Re: QNetworkAccessManager не обрабатывает перенаправления
Отправлено: alexis031182 от Февраль 05, 2013, 19:01
Например, так:
Код:
void ANetworkLoader::slotLoadFinished() {
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    if(!reply) return;

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

    if(status_code == 200) {_data = reply->readAll(); emit receiveData(_data);}
    else {
        QUrl redir_url
            = reply->attribute(QNetworkRequest::RedirectionTargetAttribute)
                .toUrl();

        if(!redir_url.isEmpty()) slotGet(redir_url);
        else emit receiveData(_data);
    }

    reply->deleteLater();
}


Название: Re: QNetworkAccessManager не обрабатывает перенаправления
Отправлено: Mr.Visor от Февраль 11, 2013, 11:10
Решение проблемы оказалось весьма простым: я по своей идиотской привычке забилзабыл прописать "http://" в начале урла запроса... отсюда и все беды.
Тема закрыта.