Мы рассмотрим пример консольного приложения с именем
01 HttpGet::HttpGet(QObject *parent)
02 : QObject(parent)
03 {
04 …
05 connect(&http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
06 }
В конструкторе мы подсоединяем сигнал
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 }
Функция
Запросы HTTP ставятся в очередь и обрабатываются асинхронно в цикле обработки событий Qt. На завершение выполнения запросов указывает сигнал
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 мы файл закрываем, уведомляя пользователя о возникновении ошибки.
Функция
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;