Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

Запросы HTTP ставятся в очередь и обрабатываются асинхронно в цикле обработки событий Qt. На завершение выполнения запросов указывает сигнал done(bool) объекта QHttp, который мы подсоединили к слоту httpDone(bool) в конструкторе.

01 void HttpGet::httpDone(bool еггог)

02 {

03 if (еггог) {

04 сегг << "Еггог: " << qPrintable(http.errorString) << endl;

05 } else {

06 сегг << "File downloaded as " << qPrintable(file.fileName) << endl;

07 }

08 file.close;

09 emit done;

10 }

После выполнения запросов HTTP мы файл закрываем, уведомляя пользователя о возникновении ошибки.

Функция main очень похожа на такую же функцию в примере ftpget:

01 int main(int argc, char *argv[])

02 {

03 QCoreApplication app(argc, argv);

04 QStringList args = app.arguments;

05 if (args.count != 2) {

06 cerr << "Usage: httpget url" << endl << "Example:" << endl

07 << " httpget<< endl;

08 return 1;

09 }

10 HttpGet getter;

11 if (!getter.getFile(QUrl(args[1])))

12 return 1;

13 QObject::connect(&getter, SIGNAL(done), &app, SLOT(quit));

14 return app.exec;

15 }

Класс QHttp содержит много операций, включая setHost, get, post и head. Если для входа на сайт необходимо выполнить аутентификацию пользователя, setUser может использоваться для установки имени пользователя и пароля. QHttp может использовать сокет, указанный программистом, а не свой собственный внутренний QTcpSocket. Это делает возможным применение безопасного сокета QtSslSocket (который предоставляется компонентом Qt Solution компании «Trolltech») для работы с HTTP через SSL.

Мы можем применять функцию post для пересылки пар «имя = значение» в сценарий CGI:

http.setHost("www.example.com");

http.post("/cgi/somescript.py", "x=200&y=320", &file);

Мы можем передавать данные в виде 8-битовой строки либо передавать открытое устройство QIODevice, например QFile. Для обеспечения большего контроля мы можем использовать функцию request, которая принимает произвольные заголовок и данные HTTP. Например:

QHttpRequestHeader header("POST", "/search.html");

header.setValue("Host", "www.trolltech.com");

header.setContentType("application/x-www-form-urlencoded");

http.setHost(www.trolltech.com);

http.request(header, "qt-interest=on&search=opengl");

QHttp генерирует сигнал requestStarted(int) в начале выполнения команды и сигнал requestFinished(int, bool) после завершения выполнения команды. Параметр типа int является числом, которое идентифицирует запрос. Если мы собираемся отслеживать результаты выполнения отдельных запросов, мы можем сохранять эти идентификаторы при постановке запросов в очередь. Отслеживание идентификаторов обеспечивает более оперативную обратную связь с пользователем.

В большинстве приложений нас интересует результат исполнения всей последовательности команд. Это легко достигается путем подсоединения сигнала done(bool), который генерируется всякий раз, когда очередь запросов становится пустой.

При возникновении ошибки очередь запросов автоматически очищается. Но если мы после возникновения ошибки зададим новые запросы с использованием того же объекта QHttp, они будут поставлены в очередь и затем выполнены в обычном порядке.

Как и QFtp, класс QHttp содержит сигнал readyRead, а также функции read и readAll, которые мы можем использовать вместо указания устройства ввода—вывода.

Написание клиент—серверных приложений на базе TCP

Классы QTcpSocket и QTcpServer могут использоваться для реализации клиентов и серверов TCP. TCP — это транспортный протокол, который составляет основу большинства прикладных протоколов сети Интернет, включая FTP и HTTP, и который может также использоваться для создания пользовательских протоколов.

  • Читать дальше
  • 1
  • ...
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: