QT HTTP 通讯 使用方法

  1. //////////////grabthread.h////////////////////  
  2. #ifndef GRABTHREAD_H  
  3. #define GRABTHREAD_H  
  4.   
  5. #include <QThread>  
  6. class QNetworkAccessManager;  
  7. #include <QNetworkReply>  
  8.   
  9. class GrabThread : public QThread  
  10. {  
  11.     Q_OBJECT  
  12. public:  
  13.     explicit GrabThread(QObject *parent = 0);  
  14.     void run();  
  15.     void saveToFile(QString&);  
  16.   
  17.     bool runrun;  
  18.   
  19. signals:  
  20.   
  21. public slots:  
  22.     void slot_httpFinished();  
  23.     void slot_httpError(QNetworkReply::NetworkError);  
  24.   
  25. private:  
  26.     QNetworkAccessManager* qnam;  
  27.     QNetworkReply* reply;  
  28.     QString query_word;  
  29.     bool is_init;  
  30. };  
  31.   
  32. #endif // GRABTHREAD_H  
  33.   
  34.   
  35.   
  36. //////////////grabthread.cpp////////////////////  
  37. #include <QtNetwork/QNetworkAccessManager>  
  38. #include <QtNetwork/QNetworkReply>  
  39. #include <QtNetwork/QNetworkRequest>  
  40. #include <QEventLoop>  
  41.   
  42. GrabThread::GrabThread(QObject *parent) :  
  43.     QThread(parent),  
  44.     is_init(true)  
  45. {  
  46. }  
  47.   
  48. void GrabThread::run()  
  49. {  
  50.     if (is_init)  
  51.     {  
  52.         qnam = new QNetworkAccessManager();  
  53.         is_init = false;  
  54.     }  
  55.     while(runrun)  
  56.     {  
  57.         startQuery("");  
  58.     }  
  59. }  
  60.   
  61. void GrabThread::startQuery(QString redirect_url)  
  62. {  
  63.     QNetworkRequest request;  
  64.     QString url;  
  65.     // 如果是重定向请求, 则直接指向位置, 否则拼字符串  
  66.     if (redirect_url.length() != 0)  
  67.     {  
  68.         url = redirect_url;  
  69.     }else  
  70.     {  
  71.         url = "http://www.nuihq.com/" + query_word;  
  72.     }  
  73.     // 设定url  
  74.     request.setUrl(QUrl(url));  
  75.     // 设定请求头  
  76.     request.setRawHeader("Host", "www.nuihq.com");  
  77.     request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");  
  78.     request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");  
  79.     request.setRawHeader("Accept-Language", "zh-cn,zh;q=0.5");  
  80.     // TODO:使用gzip  
  81.     request.setRawHeader("Accept-Encoding", "deflate");  
  82.     request.setRawHeader("Accept-Charset", "utf-8;q=0.7,*;q=0.7");  
  83.     request.setRawHeader("Connection", "keep-alive");  
  84.   
  85.     // 使用get方式发起请求  
  86.     reply = qnam->get(request);  
  87.       
  88. /***************如果需要同步********************/  
  89.     qRegisterMetaType<QNetworkReply::NetworkError>  
  90. ("QNetworkReply::NetworkError");  
  91.     QEventLoop loop; // 使用事件循环使得网络通讯同步进行  
  92.     connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));  
  93.     connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this,  
  94.             SLOT(slot_httpError(QNetworkReply::NetworkError)));  
  95.     loop.exec(); // 进入事件循环, 直到reply的finished()信号发出, 这个语句才能  
  96.                         //退出  
  97.     slot_httpFinished();  
  98. /**************************************/  
  99. /****************如果需要异步**********************/  
  100.     connect(reply, SIGNAL(finished()), this, SLOT(slot_httpFinished()));  
  101.     qRegisterMetaType<QNetworkReply::NetworkError>("QNetworkReply::NetworkError");  
  102.     connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this,  
  103.             SLOT(slot_httpError(QNetworkReply::NetworkError)));  
  104. /**************************************/  
  105. }  
  106.   
  107. void GrabThread::slot_httpFinished()  
  108. {  
  109.     int http_status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();  
  110.   
  111.     reply->close();  
  112.     reply->deleteLater();  
  113.   
  114.     // 判断是否是重定向  
  115.     if (http_status == 302)  
  116.     {  
  117.         startQuery(reply->rawHeader("Location"));  
  118.     }else  
  119.     {  
  120.         QString reply_content = QString::fromUtf8(reply->readAll());  
  121.         if (reply->error() == QNetworkReply::NoError)  
  122.         {  
  123.             saveToFile(reply_content);  
  124.         }else  
  125.         {  
  126.             qDebug() << "ERROR:" << query_word << " CODE:" << reply->error();  
  127.         }  
  128.     }  
  129. }  
  130.   
  131. void GrabThread::slot_httpError(QNetworkReply::NetworkError)  
  132. {  
  133.   
  134. }  
  135.   
  136. void GrabThread::saveToFile(QString & html_content)  
  137. {  
  138.     QFile file("html/" + query_word + ".html");  
  139.     file.open(QIODevice::WriteOnly);  
  140.     file.write(file_content.toUtf8());  
  141.     file.close();  
  142. }
posted @ 2017-10-20 13:12  苍月代表我  阅读(3196)  评论(0编辑  收藏  举报