0

我試圖得到一個網頁的HTML源線後空的,我的代碼如下:的Qt - QNetworkReply是製作要求

void Helper::start() 
{ 
    QString url = "http://www.youtube-mp3.org/get?video_id=PnL4Z0ebcBc"; 

    QNetworkAccessManager *manager = new QNetworkAccessManager(); 

    QNetworkRequest request; 
    request.setUrl(QUrl(url)); 
    request.setRawHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0;)"); 

    QNetworkReply *reply = manager->get(request); 
    QObject::connect(reply, SIGNAL(finished()), this, SLOT(onFinished())); 
    QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError))); 
} 

void Helper::onFinished() 
{ 
    QIODevice * content = static_cast<QIODevice*>(QObject::sender()); 
    QString html = content->readAll(); 
    content->deleteLater(); 

    qDebug() << html; // It's empty!! 
} 

void Helper::onError(QNetworkReply::NetworkError err) 
{ 
    qDebug() << "Starting On Error ...."; 
    QIODevice * content = static_cast<QIODevice*>(QObject::sender()); 
    QString error = content->errorString(); 
    content->deleteLater(); 

    qDebug() << error; 
} 

html字符串是空的,我想不出爲什麼!

當我將URL更改爲Google的時,它可以工作,出了什麼問題? (因爲我沒有得到任何類型的錯誤)

+0

使用[QNetworkReply :: error()](http://qt-project.org/doc/qt-5/qnetworkreply.html#error)檢查錯誤。 – 2014-10-10 22:32:59

+0

@ OlegShparber檢查,沒有錯誤!奇怪的。 – 2014-10-11 03:14:54

+0

@MrEricSir我的代碼可以與其他網站一起工作,但不能像上面描述的那樣工作 – 2014-10-11 03:15:52

回答

2

你得到空響應的原因是因爲你沒有捕捉到的URL重定向。

代碼http://www.youtube-mp3.org/get?video_id=PnL4Z0ebcBc中提到的網址被重定向到http://www.youtube-mp3.org/?e=session_expired&t#v=PnL4Z0ebcBc。因此,無論是在代碼中提供重定向的url,還是花費一些努力並處理重定向。

首先,爲了這個目的,最好使用QNetworkReply類而不是QIODevice類。

QNetworkReply* content= qobject_cast<QNetworkReply*>(sender()); 

然後檢查是否正在使用QNetworkReply::attribute方法重定向。

content->attribute(QNetworkRequest::RedirectionTargetAttribute) 

我寫了工作代碼,但我沒有看到需要在這裏分享,因爲我已經告訴了關鍵的東西。 ;)

此外,我建議你看看this