Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: AlphaGh0St от Март 22, 2011, 00:45



Название: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: 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.

Заранее спасибо.


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: serg_hd от Март 22, 2011, 00:54
QNetworkCookieJar* QNetworkAccessManager::cookieJar() const
void QNetworkAccessManager::setCookieJar(QNetworkCookieJar* cookieJar)

никаких qwebview тут нет


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: merke от Март 22, 2011, 17:10
Использовать QNetworkAccessManager

Полученные данные скармливать QWebView


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: AlphaGh0St от Март 23, 2011, 00:30
А можно подробнее, как это реализовать?


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: Denjs от Март 23, 2011, 03:58
Возможно будет полезно  :

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

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

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

.


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: AlphaGh0St от Март 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

Можно подробнее, как это реализовать?


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: Denjs от Март 23, 2011, 20:53
AlphaGh0St, вы мои примеры разбирали? там есть получение данных от http-сервера. В QString перевести эти данные не составит большого труда.
Потом делаете QWebView::setHtml(),
. Вы вообще описание класса QWebView в ассистанте читали?


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: AlphaGh0St от Март 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 ничего нет.


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: Denjs от Март 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() - как в примере кода сверху.


Название: Re: Отправка GET/POST запросов и приём ответа через QWebView
Отправлено: AlphaGh0St от Март 24, 2011, 23:26
С ответом от сервера вопрос решён.
Пока поэкспериментирую немножко.

Спасибо за помощь!