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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отправка GET/POST запросов и приём ответа через QWebView  (Прочитано 13640 раз)
AlphaGh0St
Гость
« : Март 22, 2011, 00:45 »

Всем привет!
Я новичёк, по этому заранее извиняюсь, если подобная тема уже поднималась и проблема была решена. Если же нет, помогите, пожалуйста, разобраться.

Суть проблемы в том, что мне необходимо вручную формировать и отправлять GET/POST запросы через QWebView, и через него-же получать ответ.

Я гуглил по этой теме, советуют работать через классы QHttp, QHttpHeader, QHttpRequestHeader и QNetworkAccessManager...но...что-то не то...

Хотелось бы, чтобы всё выглядело следующим образом: по нажатию кнопки, заранее составленный запрос шёл через QWebView на указанный сервер, и ответ на запрос так-же возвращался в QWebView в качестве страницы.

Почему вся работа должна идти через QWebView? Потому, что он умеет хранить куки, а это очень кстати. И на много лучше видеть ответ на свой запрос в качестве странички в самом WebView'e.

...хм...вот например:
Перехожу по ссылке http://127.0.0.1/script.php. В форме скрипта задаю какое-либо числовое значение -> жму на кнопку -> скрипту идёт POST запрос с указанным числом -> выполняется какой-либо расчёт -> выдаётся результат.
Нужно автоматизировать этот процесс. Чтобы по нажатию кнопки в Qt приложении, запрос формировался и отсылался автоматически, опять же через QWebView.

Заранее спасибо.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Март 22, 2011, 00:54 »

QNetworkCookieJar* QNetworkAccessManager::cookieJar() const
void QNetworkAccessManager::setCookieJar(QNetworkCookieJar* cookieJar)

никаких qwebview тут нет
Записан

kubuntu/Win7/x64/NetBeans
merke
Гость
« Ответ #2 : Март 22, 2011, 17:10 »

Использовать QNetworkAccessManager

Полученные данные скармливать QWebView
Записан
AlphaGh0St
Гость
« Ответ #3 : Март 23, 2011, 00:30 »

А можно подробнее, как это реализовать?
Записан
Denjs
Гость
« Ответ #4 : Март 23, 2011, 03:58 »

Возможно будет полезно  :

http://www.prog.org.ru/topic_15336_0.html

 - как пример того как работать с http-запросами.
Если мне не изменяет память - там есть и кукисы в числе прочего.

QHttp объявлен как не рекомендуемый к использованию (см ассистант)

.
« Последнее редактирование: Март 23, 2011, 04:01 от Denjs » Записан
AlphaGh0St
Гость
« Ответ #5 : Март 23, 2011, 19:17 »

Просто отправлять запросы получалось:

Например с помощью QNetworkRequest (request),  QNetworkAccessManager (manager) и QNetworkReply (*reply):
request.setUrl(QUrl("http://127.0.0.1/script.php?do=add"));
reply = manager.post(request, "var2=on");

До этого пробовал отправлять запросы через QHttp:
http->setHost("127.0.0.1");
http->request(header);
Писали, что этот класс не может работать с куками.

В лог файле, который ведёт скрипт отражено, что запросы проходят успешно.
Но это не совсем то, что нужно.
Вот уже неделю мучаюсь, ну как отправить запрос именно через QWebView и на него же принять ответ... Да, я находил примеры отправки запросов, но нигде не видел ничего о том, чтобы вся работа шла через QWebView.

----------------------------------
Александр, Вы писали:
- Использовать QNetworkAccessManager
- Полученные данные скармливать QWebView

Можно подробнее, как это реализовать?
Записан
Denjs
Гость
« Ответ #6 : Март 23, 2011, 20:53 »

AlphaGh0St, вы мои примеры разбирали? там есть получение данных от http-сервера. В QString перевести эти данные не составит большого труда.
Потом делаете QWebView::setHtml(),
. Вы вообще описание класса QWebView в ассистанте читали?
Записан
AlphaGh0St
Гость
« Ответ #7 : Март 23, 2011, 22:29 »

Ну разумеется, документацию читал и пример просматривал.
Всё к одному сводится... Вот к примеру этот код:
   
QNetworkAccessManager manager;
QNetworkRequest request;
QNetworkReply *reply;
QByteArray data;

request.setUrl(QUrl("http://127.0.0.1/script.php?do=add"));
reply = manager.post(request, "var1=on");

data = reply->readAll();
//QString dataString(data);
ui->label->setText("bytes send: " + data.size());
ui->webView->setHtml(data);

Он отправляет запрос, запрос проходит. Но, видимо где-то я ошибся, т.к. в data ничего нет.
Записан
Denjs
Гость
« Ответ #8 : Март 24, 2011, 00:27 »

Плохо, значит, читали. Или далеко не всё.

Cтатья Home>>Modules>>QtNetwork>>QNetworkAccessManager.
Первый же пример кода в этой статье -
Код:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
 connect(manager, SIGNAL(finished(QNetworkReply*)),
         this, SLOT(replyFinished(QNetworkReply*)));

 manager->get(QNetworkRequest(QUrl("http://qt.nokia.com")));
- он "кагбэНамекает" на асинхронную сущность методов .post() и .get().

а описание метода get() - так вообще говорит вам об этом явно:
Цитировать
...returns a new QNetworkReply object opened for reading which emits the readyRead() signal whenever new data arrives.
т.е. пока нет readyRead() - то и данных тоже нет никаких().

В вашем коде, вы не дожидаетесь ответа сервера, и сразу же пытаетесь что то читать.
QNetworkReply - он ещё ОЧЕНЬ ПУСТОЙ в момент когда вы ему говорите readAll(). Запрос ещё может даже и не дошел до сервера в этот момент и стоит где-нибудь в недрах перегруженного маршрутизатора... или php только-только начинает разбирать http-заголовок того что вы ему там прислали.... а вы тут уже рвать и метать готовы. Сеть не так быстро работает, как процессор команды перебирать умеет...
Вот дождитесь от него сигнала QNetworkReply::readyRead() - и уже потом подумывайте о том, что бы что-нибудь почитать их него.
А ещё лучше - дождитесь сигнала QNetworkAccessManager::finished() - как в примере кода сверху.
« Последнее редактирование: Март 24, 2011, 00:38 от Denjs » Записан
AlphaGh0St
Гость
« Ответ #9 : Март 24, 2011, 23:26 »

С ответом от сервера вопрос решён.
Пока поэкспериментирую немножко.

Спасибо за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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