问题标签 [qnetworkaccessmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1650 浏览

qt - 在 Qt 中循环运行多个 url 请求

在 Qt 中,我需要连接并检查多台服务器上的更新,为此我使用 QNetworkAccessManager。问题是在当前请求得到答复并完成之前,我不想连接到下一个 url。我的第一个想法是使用如下所示的循环,但是我遇到了一个问题,即在当前完成之前我不想连接到下一个 url。

//做更多的事情}

我解决问题的另一个想法是像这样构建它:

现在在当前 url 完成之前不会请求下一个 url。这个解决方案的问题是我有一些问题,因为许多connection()和finishedSlot()将同时打开,我在这些方法中创建的东西不会被删除,这将导致内存问题。我知道它与 query.exec(sqlString) 有关,因为没有它,一切都会像它应该的那样工作。但是为什么这两种解决方案之间会有如此大的差异呢?

你会如何解决这个问题?

0 投票
2 回答
11283 浏览

windows - 使用 QNetworkAccessManager 的 post() 方法上传文件

我在使用 Qt 应用程序时遇到了一些问题;特别是 QNetworkAccessManager 类。我正在尝试使用 QNetworkAccessManager 的 post() 方法对二进制文件执行简单的 HTTP 上传。文档说明我可以将指向 QIODevice 的指针指向 post(),并且该类将传输在 QIODevice 中找到的数据。这表明我应该能够给 post() 一个指向 QFile 的指针。例如:

在我正在开发的 Windows 系统上似乎发生的事情是我的 Qt 应用程序从 QFile 推送数据,但随后没有完成请求;它似乎正坐在那里等待更多数据从文件中显示出来。在我手动终止应用程序之前,发布请求不会“关闭”,此时整个文件显示在我的服务器端。

从一些调试和研究来看,我认为这是因为 QFile 的 read() 操作在到达文件末尾时没有返回 -1。我认为 QNetworkAccessManager 正在尝试从 QIODevice 读取,直到它从 read() 获得 -1,此时它假定没有更多数据并关闭请求。如果它不断地从 read() 中得到一个返回码为零,QNetworkAccessManager 会假设可能有更多的数据进来,所以它会一直等待那个假设的数据。

我已经用一些测试代码确认了 QFile 的 read() 操作在你读到文件末尾后才返回零。这似乎与 QNetworkAccessManager 的 post() 方法期望 QIODevice 的行为方式不兼容。我的问题是:

  1. 这是 QFile 在 Windows 下工作方式的某种限制吗?
  2. 还有其他方法我应该使用 QFile 或 QNetworkAccessManager 通过 post() 推送文件吗?
  3. 这根本不起作用,我是否必须找到其他方法来上传我的文件?

任何建议或提示将不胜感激。

更新:事实证明我有两个不同的问题:一个在客户端,一个在服务器端。在客户端,我必须确保我的 QFile 对象在网络事务期间一直存在。QNetworkAccessManager 的 post() 方法会立即返回,但实际上并没有立即完成。您需要在 QNetworkAccessManager 的 finished() 信号上附加一个插槽,以确定 POST 何时实际完成。在我的情况下,将 QFile 或多或少永久地保持在周围很容易,但我还在finished() 信号上附加了一个插槽,以检查来自服务器的错误响应。

我将信号连接到插槽,如下所示:

当是时候发送我的文件时,我写了这样的帖子代码(请注意,compressedFile 是我的类的成员,因此在此代码之后不会超出范围):

来自 QNetworkAccessManager 的 finished(QNetworkReply*) 信号触发了我的 postFinished(QNetworkReply*) 方法。发生这种情况时,我可以安全地关闭compressedFile 并删除co​​mpressedFile 表示的数据文件。出于调试目的,我还添加了一些 printf() 语句来确认事务已完成:

由于compressedFile 不会立即关闭并且不会超出范围,因此 QNetworkAccessManager 能够花费尽可能多的时间来传输我的文件。最终交易完成,我的 postFinished() 方法被调用。

我的另一个问题(这也导致了我看到事务从未完成的行为)是我的 Web 服务器的 Python 代码没有正确地处理 POST,但这超出了我最初的 Qt 问题的范围。

0 投票
1 回答
1376 浏览

qt - Qt Jambi:访问 QNetworkReply 的内容

我无法访问 QNetworkReply 对象的内容。内容似乎为空或为零。根据文档(从 c++ 到 java 的翻译),我认为我已经正确设置了这个,但无济于事。此外,正在报告“未知错误”。

任何想法都非常感谢。代码:

0 投票
1 回答
545 浏览

qt - 如何使用 Qt 分块下载?

由于许多原因,我需要逐个 1024 字节下载文件。

我在 QnetworkAccessManager 中一无所获。我不能使用“标头技术”,因为我的服务器不支持它。

我称之为标头技术,即在 http 请求的标头中发送诸如“Content-Range: bytes 21010-47000/47022”之类的东西的技术

0 投票
1 回答
12941 浏览

qt - QNetworkRequest 和默认 SSL 配置

我正在使用以下代码向服务器发出 HTTPS 请求。

一切似乎都与我的测试服务器一起工作,但我想知道是否建议设置 defaultConfiguration (取消注释第二行)或者网络 API 是否在使用 SSL 时自动检查所有 defaultConfigurations?如果它检查,如果我添加一个自定义配置也可以吗?我的意思是,是否需要将自定义配置附加到默认配置列表中?例如:

编辑:我想补充一点,我正在 Symbian 平台上工作。

0 投票
1 回答
2743 浏览

qt - QEventLoop 和 QNAM 的 QTimer 超时问题

我创建了自己的 HTTP 类,该类利用 QNAM 并提供发送 HTTP 请求的方法。它使用 QEventLoop 进行同步,使用 QTimer 进行超时。

我的解决方案面临一些问题。在某些 Symbian 平台上,我的 QTimer 信号超时太快(例如,在 1 秒后超时为 30 秒)。如果我的 HTTP Post 播放负载很大或者我通过 GET 下载文件(请求需要一些时间才能完成),通常会发生这种情况。我想指出,相同的代码在某些设备(S60 第 3 版)上运行良好,但另一方面,某些设备(第 5 版)几乎总是出现此错误。

这是一个代码片段:

我个人认为以下之一可能会导致问题:

  • 重新进入本地事件循环会弄乱信号
  • 我多次使用相同的 QNAM(在同一会话期间有多个请求)。这是必需的,因为如果我销毁 QNAM,我的会话将在服务器端关闭。

有没有人能够看到一些可能导致这种行为的错误?

平台:Symbian S60 3rd/5th edition

工具:诺基亚 Qt SDK

0 投票
1 回答
796 浏览

qt - 连续上传导致 QNetworkReply 错误“无法分配内存”

我有一个用于 symbian 的 Qt 应用程序,它接收 gps 数据,将其存储到数据库中并尝试将其发布到服务器。前两个步骤可以正常工作,但连续发布会使我的应用程序崩溃或中断我的互联网连接。

我出于调试目的修改了我的应用程序,因此它仅每 10 秒将数据发布到服务器。应用程序运行良好约 45-90 分钟,没有任何显着的内存增加。

在那之后,我会从 QNetworkReply 收到一个错误,说"Cannot allocate memory"
同时内存使用量增加了大约 63500(字节?)。
在下一次上传时,我会收到“无效的套接字描述符”的回复,然后我的 QtCreator 调试输出充满了“7 上的异常 [将执行 setdefaultif(0) - hack]”

有人知道这里出了什么问题吗?我无法从我的上传代码中找到可能导致此问题的错误。

这是我的上传脚本。

差点忘了,我用诺基亚 N97mi​​ni、5230 和 5800 测试过,它们的行为方式都一样。

编辑。忘了提到当互联网连接“死”时,我仍然可以看到 3G 已打开,但使用网络浏览器连接到互联网失败。当我关闭应用程序并尝试使用浏览器连接到互联网时,它显示“Web:内存已满,...”(来自应用程序的 Web 请求工作正常)我正在使用诺基亚能源分析器,它没有显示任何内存迹象满。甚至对此进行了测试并启动了 2 个游戏、ovi 地图和大量其他应用程序,即使它们消耗了超过 40MB 的内存,它们也能正常工作。

0 投票
1 回答
3361 浏览

qt - 如何从 QWebPage 使用的 QNetworkReply 读取数据?

QWebPage用来下载网页及其所有资源。同时,我想掌握 Qt 在此过程中下载的原始数据。QNetworkReply通过从in信号中读取数据来做到这void QNetworkAccessManager::finished(QNetworkReply * reply) 一点并不是一个好的解决方案,因为数据本身可能已经被读取QWebPage。这是因为

QNetworkReply 是一个顺序访问的 QIODevice,这意味着一旦从对象中读取数据,它就不再由设备保存。

根据详细QNetworkReply描述。

但是QWebPage可以配置为使用QNetworkAccessManager带有覆盖createRequest方法的自定义

我认为正确的解决方案是创建一个代理并在方法QNetworkReply中返回它。createRequest该代理应该允许从回复中读取数据,就像原始的情况一样QNetworkReply(以便QWebPage可以从中读取数据),但同时该代理应该允许在其他对象读取数据后读取数据QWebPage。换句话说,我们需要tee作为QNetworkReplyIODevice类。

这个代理怎么写?

0 投票
2 回答
10861 浏览

c++ - 服务器需要cookie时的QT HTTP Post问题

我一直在尝试这一天,但没有成功。请帮助解决问题。在谷歌搜索中,我发现许多用户都有这个问题,但我找不到解决方案。

我正在尝试在 QT C++ 中进行 HTTP 发布,并且我已经尝试在 python 中执行此操作(我的问题不是 python 问题,所以 Qt 专业人士请帮忙).. 我知道,我在处理 cookie 和所有内容方面有问题,所以请帮忙。请提供可能的解决方案。

在python中,代码简洁明了。我已经剥离了错误处理和所有额外的东西以使其变得简单。

我制作的 QT 等效项:-

现在的问题是我无法在 QT 中做同样的事情。我面临的问题:

  1. 处理 cookie
  2. 处理重定向 (HTTP 302)
  3. 保留 cookie 以进行未来的 POST

所有这些都是在 python 中自动完成的。下面,代码没有直接关系,但我对此进行了编码以允许在 POST 中进行重定向。代码与我用来制作它的链接非常相​​似。

0 投票
3 回答
7071 浏览

qt - 如何告诉 QWebPage 不加载特定类型的资源?

如何告诉QWebPage不加载特定类型的资源,如 js、css 或 png?