2015-04-02 39 views
-1

我們使用QNetworkAccessManager來請求遠程URL,但是我們遇到了一個問題:即使它可以獲取響應主體大小,但它不能獲取任何html。QNetworkAccessManager無法獲得任何HTML

這是代碼:

manager=new QNetworkAccessManager(0); 
    cookie = new QNetworkCookieJar(0); 
    manager->setCookieJar(cookie); 
    QString str_url="http://www.wangdaizhijia.com/daohang.html"; 
    QNetworkRequest request; 
    request.setUrl(QUrl(str_url)); 
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
    request.setRawHeader("Accept-Language", "zh-CN,zh;q=0.8"); 
    request.setRawHeader("Cache-Control", "no-cache"); 
    request.setRawHeader("Connection", "keep-alive"); 
    request.setRawHeader("DNT","1"); 
    request.setRawHeader("Pragma","no-cache"); 
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"); 
QNetworkReply *reply=manager->get(request); 
    QEventLoop eventLoop; 
    QTimer timer; 
    QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit())); 
    QObject::connect(&timer, SIGNAL(timeout()),&eventLoop, SLOT(quit())); 
    timer.start(5*1000); 
    eventLoop.exec(); 
    if(!timer.isActive()) 
    { 
     timer.stop(); 
    } 
    QByteArray temp=reply->readAll(); 
    qDebug()<<"size is"<<temp.size(); 
    qDebug()<<"html is"<<temp; 

如果我們要求另一個網址,如http://www.google.com,它的工作。爲什麼?

+0

看起來像你得到的答覆之前,定時器是越來越過期。但是正如@iziseo所建議的那樣,爲什麼你要創建Event Loop並且不使用默認的信號插槽? – Kunal 2015-04-02 10:12:55

回答

1

首先出現的是在你的代碼中的錯誤:

if(!timer.isActive()) 
{ 
    timer.stop(); 
} 

應該

if(timer.isActive()) 
{ 
    timer.stop(); 
} 

從你的代碼中,我可以看到th在你正在等待使用QEventLoop的答案。 QTimer用於在遠程服務器花費太多時間來響應時停止循環。

您應該檢查是否QNetworkReply已經完成,所以你的代碼應該是這樣的:

eventLoop.exec(); 
if(timer.isActive()) 
{ 
    timer.stop(); 
} 
if(!reply->isFinished()) 
{ 
    qDebug() << "Error request timed out"; 
    return; 
} 
+0

嗨firescreamer,即時通訊tryed,問題仍然存在,s懷疑html壓縮或其他問題 – Seaman 2015-04-07 02:49:39

+0

此代碼適用於我,但我打那個網站超時幾次。增加超時時間,看看你是否仍然有問題。您還可以收聽QNetworkReply :: downloadProgress(qint64 bytesReceived,qint64 bytesTotal)信號以知道已經下載了多少數據。 – firescreamer 2015-04-07 07:14:06

+0

嗨firescreamer,它的工作now.but但我使用讀取未完成的信號,謝謝你回答我的問題。 – Seaman 2015-04-08 00:51:46

1

我總是從與完成信號連接的插槽內讀取QNetworkReply對象的內容。這是確保答覆對象準備好讀取的方式。

我不確定爲什麼你需要在這種情況下的事件循環。

剛剛嘗試連接完成信號的功能,該位移動到該函數:

QByteArray temp = reply - > readAll(); 
qDebug() << "size is" << temp.size(); 
qDebug() << "html is" << temp;