crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QHttp, небольшой вопрос
XpycT
  опции профиля:
сообщение 3.8.2009, 16:29
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть программа, которая в данный момент использует 5 запросов
  1. Авторизация на 1-ом сайте
  2. Авторизация на 2-ом сайте
  3. Запрос инфо с 1-го сайта
  4. Запрос инфо с 2-го сайта (опциональный)
  5. Загрузка данных на 1-й сайт (опциональный)

Причем первые три выполняются друг за другом.

Хотел узнать ваше мнение, как правельнее это оформить.
  1. Создать для каждого типа по QHttp и привязать каждому свои слоты для обработки
  2. Один QHttp, назначать тип запроса (допустим через enum), и после этого выбирать нужное действие через if/switch

Или может есть другой способ?

Просто смотрел и в книгах и в примерах, но там более одного запроса за раз не происходит. А так как web-запросами работал только в PHP, то не знаю как будет правильнее :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 3.8.2009, 17:14
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Тебе все равно придется устанавливать 2 http иоединения, отправлять данные и ждать на них и ...
Потому думаю, что 1 вариант. Да и во 2 варианте я не совсем понял, что ты хотел сказать. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 3.8.2009, 18:23
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 3.8.2009, 17:14) *
Да и во 2 варианте я не совсем понял, что ты хотел сказать. :)

Уже сам вижу что не понятно :) Суть второго варианта - один QHttp и переменная, которая определяет тип действия. Вот допустим кусок кода, который сейчас стоит
Раскрывающийся текст
void MainWindow::readResponseHeader(const QHttpResponseHeader &responseHeader)
{
    
     switch (responseHeader.statusCode()) {
     case 302:                   // Found
         {
             switch(currentResponseType){
                     case trackerLogin:{                        
                         RegisterCookie(responseHeader);
                         }
                         break;
                     case uploadTorrent:{
                         QString link = responseHeader.value("Location");
                         QString linkID;

                         if(!link.isEmpty()){
                            QRegExp rx("(\\d+)");
                            int pos = 0;
                            while ((pos = rx.indexIn(link, pos)) != -1) {
                                 linkID = rx.cap(1);
                                 pos += rx.matchedLength();
                             }                          
                          getFile(linkID);
                         }

                         }
                         break;
             }
         }
         break;
     case 200:{                   // Ok
            switch(currentResponseType){
                 case trackerLogin:{
                     setStatus(Disconnected);
                    }
                    break;
                 case getCategory:
                 case uploadTorrent:
                 case None:        
                     break;                
             }
     }
         break;
     case 301:                   // Moved Permanently
     case 303:                   // See Other
     case 307:                   // Temporary Redirect
         // these are not error conditions
         break;

     default:
         QMessageBox::information(this, tr("HTTP"),
                                  tr("Download failed: %1.")
                                  .arg(responseHeader.reasonPhrase()));
         http->abort();
     }
}

Тобишь просто перебираю действия через switch...case
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 3.8.2009, 19:48
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Тот код, что ты привел всеравно понадобится, так как тебе нужно обрабатывать что возвращает сервер в любом случае как для 1 оединения так и для 2.

Тебе же нужны соединения с 2 серваками, значит 2 http соединения. Получил данные от одного передал другому, а во время передачи 2 получаешь следующие данные с 1 и т.д.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 3.8.2009, 22:31
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


У меня похожая ситуация была (параллельно надо авторизоваться/обмениваться данными с несколькими сайтами, и при этом информацию о прогрессе выводить на виджет). Я сделал разных наследников (просьба сильно не ругаться на нерациональность) класса QHttp (типа GetRequest, PostRequest, PutRequest) для разных видов запросов (в конструторах сразу передаю URL, хидеры, данные и пр.), внутри кого надо с кем надо соединил, и в слоте http_done (куда приходит сигнал done) наружу сделал эмит того, что сервер сказал, и сразу deleteLater().
В итоге запрос получается довольно лаконичный, что-то вроде:
  GetRequest *g = new GetRequest(QUrl("https://picasaweb.google.com"),data);
  connect(g,SIGNAL(requestComplete()),SLOT(requestComplete()));
  g->run();

Соглашусь, что для каждого запроса заново создавать QHttp, возможно, неправильно, зато потом кодить удобно, когда куча разнотипных запросов много куда.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 4.8.2009, 9:08
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Elfinit @ 3.8.2009, 23:31) *
для каждого запроса заново создавать QHttp, возможно, неправильно
Никто не говорит, что не правильно. Просто нет смысла держать соединение, если оно пока не нужно.
Те же интернет браузеры по подобному принципу работают, создают подключение для получения данных, а потом разрывают его, чтобы в следующий раз снова установить.

Просто как в твоем так и в данном случае лучше использовать несколько HTTP объектов, чтобы не было путаницы и легче потом было читать код.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.8.2009, 11:11
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


QHttp в Qt 4.6 он depricated. Тролли пытаются от него избавится. IMHO лучше использовать QNetworkAccessManager.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 4.8.2009, 11:36
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 4.8.2009, 11:11) *
QHttp в Qt 4.6 он depricated. Тролли пытаются от него избавится. IMHO лучше использовать QNetworkAccessManager.


Ну в моем случае можно и не избавляться , хотя и замена займет всего минут 5-10 :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maxvanceffer
  опции профиля:
сообщение 19.8.2009, 14:40
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ребята не используйте http так как в манах заявлена что его в селдуших версиях заменят. Я использую QNetworkManager ! Он проше и может работать с очередью запросов!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 25.8.2009, 20:18
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


А как при использовании QNetworkAccessManager получить StatusCode http-response'а?

нашёл, QNetworkRequest::HttpStatusCodeAttribute

Сообщение отредактировал Elfinit - 25.8.2009, 20:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 17:20