Мы рассмотрим пример консольного приложения с именем httpget, демонстрирующего способ загрузки файла с использованием протокола HTTP. Мы не приводим здесь заголовочный файл, поскольку данный пример очень напоминает пример ftpget, который мы использовали в предыдущем разделе.

01 HttpGet::HttpGet(QObject *parent)

02 : QObject(parent)

03 {

04 …

05 connect(&http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));

06 }

В конструкторе мы подсоединяем сигнал done(bool) объекта QHttp к закрытому слоту httpDone(bool).

01 bool HttpGet::getFile(const QUrl &url)

02 {

03 if (!url.isValid()) {

04 сегг << "Error: Invalid URL" << endl;

05 return false;

06 }

07 if (url.scheme() != "http") {

08 cerr << "Error: URL must start with 'http:'" << endl;

09 return false;

10 }

11 if (url.path().isEmpty()) {

12 cerr << "Error: URL has no path" << endl;

13 return false;

14 }

15 QString localFileName = QFileInfo(url.path()).fileName();

16 if (localFileName.isEmpty())

17 localFileName = "httpget.out";

18 file.setFileName(localFileName);

19 if (!file.open(QIODevice::WriteOnly)) {

20 cerr << "Error: Cannot open "

21 << qPrintable(file.fileName()) << " for writing: "

22 << qPrintable(file.errorString()) << endl;

23 return false;

24 }

25 http.setHost(url.host(), url.port(80));

26 http.get(url.path(), &file);

27 http.close();

28 return true;

29 }

Функция getFile() проверяет ошибочные ситуации так же, как рассмотренная ранее функция FtpGet::getFile(), и использует тот же подход при задании имени локального файла. При загрузке файлов с веб-сайта не требуется входить в систему, поэтому мы просто указываем хост и порт (используя стандартный для HTTP порт 80, если его нет в URL) и скачиваем данные в файл, заданный вторым аргументом функции QHttp::get().

Запросы 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 http://doc.trolltech.com/qq/index.html" << endl;

08 return 1;

09 }

10 HttpGet getter;

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

12 return 1;

Перейти на страницу:

Похожие книги