Russian Qt Forum
Ноябрь 27, 2024, 07:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QNetworkAccessManager не обрабатывает перенаправления  (Прочитано 3436 раз)
Mr.Visor
Гость
« : Февраль 05, 2013, 18:38 »

Пишу класс для работы с API Tumblr'а. Нужно либо скачать аватар пользователя, либо получить прямую ссылку на него (в действительности, всё сводится к последнему варианту).
В документации по API указано, что необходимо использовать URL вида:
api.tumblr.com/v2/blog/mrvisor.tumblr.com/avatar/64
и что прямая ссылка на изображение будет передана через поле Location в http-заголовке. Действительно, так и есть (если проверять через, например, bertal.ru)

Однако... 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'а, разумеется, не было).
Записан
alexis031182
Гость
« Ответ #1 : Февраль 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();
}
Записан
Mr.Visor
Гость
« Ответ #2 : Февраль 11, 2013, 11:10 »

Решение проблемы оказалось весьма простым: я по своей идиотской привычке забилзабыл прописать "http://" в начале урла запроса... отсюда и все беды.
Тема закрыта.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.435 секунд. Запросов: 20.