获取简单 URL 时出现 QNetworkReply 错误“连接已关闭”

Posted

技术标签:

【中文标题】获取简单 URL 时出现 QNetworkReply 错误“连接已关闭”【英文标题】:QNetworkReply error "Connection closed" when getting a simple URL 【发布时间】:2014-10-06 13:55:31 【问题描述】:

我正在尝试制作一个简单的文件下载器。这是我下载 URL 的代码段;如果我尝试获取诸如“http://***.com”之类的简单 URL,则此代码可以正常工作。 但是,当我指定 重定向 的 URL 时,它会抛出一个错误,提示 “连接已关闭”。

//Sets a sample URL which redirects.
QString url = "http://downloads.sourceforge.net/project/gretl/gretl/1.9.92/gretl-1.9.92.tar.xz"

QNetworkAccessManager * networkAccessManager = new QNetworkAccessManager(this);

QNetworkRequest * networkRequest = new QNetworkRequest(QUrl(url));

//Getting the URL
QNetworkReply * networkReply = networkAccessManager->get(*networkRequest);

此外,我还连接了以下信号槽以识别网络错误:

 //Connects networkReply object's error signal to a slot which prints the error.
 connect(networkReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(printError(QNetworkReply::NetworkError)));

这是在 networkReply 发出错误信号时打印错误的插槽:

void printError(QNetworkReply::NetworkError code)

     qDebug() << "Network Error Code: " << code;
     qDebug() << networkReply->errorString();


由于这个错误,networkReply 对象永远不会收到任何标头。

我的需要是通过这种方法读取HTTP状态码:QNetworkReply::attribute(QNetworkRequest::HttpStatusCodeAttribute)

我无法读取 HTTP 状态代码,因为我没有获取标头。

谁能说说怎么回事? 提前致谢! :)

【问题讨论】:

【参考方案1】:

Here 和 here 是处理这种情况的好例子 - 基本上你为finished 信号添加一个槽,然后检查 301 和/或QNetworkRequest::RedirectionTargetAttribute 属性的 HTTP 状态代码,看看你是否正在重定向,如果是,则发出重定向链接的新请求。

【讨论】:

谢谢!我没有像示例中那样设置用户代理。它在指定用户代理时起作用。我认为服务器在发现我没有用户代理时会断开连接。

以上是关于获取简单 URL 时出现 QNetworkReply 错误“连接已关闭”的主要内容,如果未能解决你的问题,请参考以下文章

尝试从URL获取参数时出现异常

我想从 JSON URL 获取图像,但是在 IOS 中获取图像时出现了一些错误

获取请求不会迅速执行,在请求中传递 URL 时出现 nil 值错误

使用 PHP cURL 获取页面时出现 403 禁止错误

获取 E/MediaPlayer:尝试从给定 URL 播放视频时出现错误 (1,-2147483648) 错误

Flutter Firestore - 获取存储为字符串的 URL 时出现空安全错误