crossplatform.ru

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


  Ответ в QHttp, небольшой вопрос
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Elfinit Дата 26.8.2009, 12:09
 
Цитата(XpycT @ 26.8.2009, 13:07) *
Цитата(Elfinit @ 25.8.2009, 20:18) *
А как при использовании QNetworkAccessManager получить StatusCode http-response'а?

нашёл, QNetworkRequest::HttpStatusCodeAttribute


Через него и получай:
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qDebug() << status; // выведет код статуса


Да,уже так и делаю) C QNetworkAccessManager даже как-то приятнее работать. И менять много не надо, простенькую обёртку написать только (в моём случае)
XpycT Дата 26.8.2009, 12:07
 
Цитата(Elfinit @ 25.8.2009, 20:18) *
А как при использовании QNetworkAccessManager получить StatusCode http-response'а?

нашёл, QNetworkRequest::HttpStatusCodeAttribute


Через него и получай:
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qDebug() << status; // выведет код статуса
Elfinit Дата 25.8.2009, 20:18
  А как при использовании QNetworkAccessManager получить StatusCode http-response'а?

нашёл, QNetworkRequest::HttpStatusCodeAttribute
maxvanceffer Дата 19.8.2009, 14:40
  Ребята не используйте http так как в манах заявлена что его в селдуших версиях заменят. Я использую QNetworkManager ! Он проше и может работать с очередью запросов!
XpycT Дата 4.8.2009, 11:36
 
Цитата(SABROG @ 4.8.2009, 11:11) *
QHttp в Qt 4.6 он depricated. Тролли пытаются от него избавится. IMHO лучше использовать QNetworkAccessManager.


Ну в моем случае можно и не избавляться , хотя и замена займет всего минут 5-10 :)
SABROG Дата 4.8.2009, 11:11
  QHttp в Qt 4.6 он depricated. Тролли пытаются от него избавится. IMHO лучше использовать QNetworkAccessManager.
ViGOur Дата 4.8.2009, 9:08
 
Цитата(Elfinit @ 3.8.2009, 23:31) *
для каждого запроса заново создавать QHttp, возможно, неправильно
Никто не говорит, что не правильно. Просто нет смысла держать соединение, если оно пока не нужно.
Те же интернет браузеры по подобному принципу работают, создают подключение для получения данных, а потом разрывают его, чтобы в следующий раз снова установить.

Просто как в твоем так и в данном случае лучше использовать несколько HTTP объектов, чтобы не было путаницы и легче потом было читать код.
Elfinit Дата 3.8.2009, 22:31
  У меня похожая ситуация была (параллельно надо авторизоваться/обмениваться данными с несколькими сайтами, и при этом информацию о прогрессе выводить на виджет). Я сделал разных наследников (просьба сильно не ругаться на нерациональность) класса 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 Дата 3.8.2009, 19:48
  Тот код, что ты привел всеравно понадобится, так как тебе нужно обрабатывать что возвращает сервер в любом случае как для 1 оединения так и для 2.

Тебе же нужны соединения с 2 серваками, значит 2 http соединения. Получил данные от одного передал другому, а во время передачи 2 получаешь следующие данные с 1 и т.д.
XpycT Дата 3.8.2009, 18:23
 
Цитата(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
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.4.2024, 23:53