Qt - 发出请求后QNetworkReply为空[重复]

Posted

技术标签:

【中文标题】Qt - 发出请求后QNetworkReply为空[重复]【英文标题】:Qt - QNetworkReply is empty after making request [duplicate] 【发布时间】:2014-10-10 21:43:21 【问题描述】:

我正在尝试在线获取网页的html源代码,我的代码如下:

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 的时,它可以正常工作,有什么问题吗? (因为我没有收到任何错误)

【问题讨论】:

用QNetworkReply::error()检查错误。 @OlegShparber 检查,没有错误!很奇怪。 @MrEricSir 我的代码适用于其他网站,但不能按上述方式运行 @AlaaElrifaie 那么很可能是重定向。检查QNetworkRequest::RedirectionTargetAttribute 属性。 建议的副本似乎有处理重定向的代码。 【参考方案1】:

你得到空响应的原因是你没有捕捉到 url 重定向。

您的代码http://www.youtube-mp3.org/get?video_id=PnL4Z0ebcBc 中提到的网址被重定向到http://www.youtube-mp3.org/?e=session_expired&amp;t#v=PnL4Z0ebcBc。因此,您要么在代码中提供重定向的 url,要么花一些精力处理重定向。

首先,最好使用QNetworkReply 类而不是QIODevice 类。

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

然后使用QNetworkReply::attribute方法检查是否被重定向。

content->attribute(QNetworkRequest::RedirectionTargetAttribute)

我已经编写了工作代码,但我认为没有必要在这里分享它,因为我已经告诉了关键的事情。 ;)

另外,我建议你看看this。

【讨论】:

以上是关于Qt - 发出请求后QNetworkReply为空[重复]的主要内容,如果未能解决你的问题,请参考以下文章

QNetworkReply 未发出 downloadProgress

QNetworkReply 不会在 HTML 注释中隐藏 JavaScript

Qt Jambi:访问 QNetworkReply 的内容

Qt QNetworkReply readAll 在再次请求相同的 url 时返回空

QNetworkReply 未被删除

http请求中的QNetworkReply和QNetworkAccessManager超时