问题标签 [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.
c++ - QSslError:证书是自签名的,不受信任
我正在尝试向证书自签名的网络服务发送休息请求。目前我正在创建一个请求,设置 url 和 auth。键作为标题。然后我告诉回复忽略这个 ssl 错误:
当我运行它时,我收到以下 ssl 错误:
9 - 证书是自签名的,不受信任
其次是网络错误nr 6:
请求失败并显示消息:SSL 握手失败
目前我忽略了所有错误,因为它似乎是唯一有效的东西。觉得脏。
如果有人知道我做错了什么,将不胜感激!
编辑:
变成:
但仍然得到同样的错误......
c++ - 即使删除线程,线程数也会增加很多
有一个应用程序,其中我有 QOBJects,它们都包含一个 QNetworkAccessManager。我知道建议只对每个应用程序进行一次调用,但由于我同时进行了 6 次以上的调用,因此我需要这样。所以,这就是我启动线程的方式。
每个线程都以列表的索引开始,以便他们可以获取他们需要上传的内容并继续执行大约 5 个步骤(使用 QNetworkAccessManager 调用)。当没有更多项目要上传时,fileUploader 会发出“finished()”信号,它会调用我所做的deleteFinishedThread
事情deleteFinishedUploader
:
或者
这些假设在完成后删除线程。
问题是,每次我启动(例如)3 个线程,每个线程都有 1 个文件要上传和处理,线程数会增加 8-10。这意味着如果我重新启动上传过程几次,线程数将从大约 5 变为 100。
我究竟做错了什么?还是我最大的问题是我使用“Windows 任务管理器”来控制它?我正在处理我删除的 QNAM 的所有回复,所有内容似乎都被删除了,但是当线程数不断增加时,我仍然摸不着头脑......
编辑:在我的文件上传器中,我在堆栈上创建了一个对象(管理器),它在堆栈上有一个 QNetworkAccessManager。当文件上传器被删除时,它会在管理器上调用“deleteLater()”,但它永远不会被删除。我们试图删除 Manager 并将其设置为 NULL,但这给了我们访问冲突,因为 Manager 还没有完成(QNetwork.dll 报告了这个问题,所以它必须是 QNAM 内部仍在运行的东西)。当我们没有遇到访问冲突时,对象被删除并且线程数恢复正常。QNAM 中有什么可以阻止我在超出范围时删除它?我应该在堆上创建 QNAM 吗?在这个阶段,即使调用 deleteLater(),也不会调用任何析构函数......
另外,如何减少句柄数?
c++ - 使用信号和插槽增量上传文件
在实施此之前,我想检查这是否会导致未定义的行为或竞争条件。
确保上传文件时,必须分块完成。我想并行上传 5 个块,它们都从同一个文件中获取数据。这会像这样发生:
在上传器的 putBlock 函数中,它通过调用调用 QNetworkAccessManager。完成后,如果失败、成功或被取消,它会发回一个信号以及 blockId,以便我知道上传了哪个块。
我现在的计划是将这些信号提取到一个插槽,该插槽应该注意这个块已上传(将它放在一个列表中以便能够放置一个块列表来完成这个 blob),将索引增加一(从 5 开始) 并获取新的数据块并重做整个过程。
我现在的问题是,如果其中两个同时完成怎么办?我不是在这里处理线程,但是由于默认情况下 HTTP 请求是线程化的,所以这里是什么情况?信号是否排队(或者我应该使用 QueuedConnection)?可以并行调用一个槽吗?有没有更好的方法来做到这一点?
c++ - 可以在同一个线程中并行调用一个槽吗?
在弄清楚如何执行此操作时遇到一些问题。将尝试解释我首先要做什么。
首先,我有一个包含只读文件的类。这个类将使用另一个类(StorageProvider)来上传这个文件的块。该类包含一个 QNetworkAccessManager。上传文件块时,我会将块发送到 StorageProvider 类,然后使用它发送到 QNAM 的 REST 请求。当 QNetworkReply 完成时,StorageProvider 将向上传者发出信号(以便它知道该块已完成)。
Uploader -> StorageProvider -> QNetworkAccessManager -> Internet
到目前为止还不错吧?我可以在上传程序中放置一个插槽,以便在 StorageHandler 完成它在 QNAM 上发出的请求时进行监听。
但是,由于 QNAM 可以通过 HTTP 同时执行 6 个请求,因此我正在考虑这样做,以便当 StorageProvider 发出信号表示它已完成一个块时,并且唯一的 BlockId 连接到该信号,允许上传者知道哪个块完成了,而不仅仅是它完成了。
这意味着每当 StorageProvider 发出信号(blockId)时将调用的插槽必须存储已完成的 id,然后查找未上传的新 id(忘了提我有一个已经上传的 ID 列表,所以当它通过 ids (0...1000) 时,它还需要 1. 将文件的索引向前推 4mb 2. 如果是,请检查已经存在的块的列表在。
所以,我的问题是:如果我有一个插槽将“currentBlockId”增加一,直到它找到下一个可以上传的插槽+读取文件 4mb,直到我们位于位置“currentBlockId”* 4mb(索引文件中的文件将像索引一样被向前推,它不会是随机访问。当这个索引到达文件末尾时,我们就完成了)并且每当完成 5 个上传中的一个时都会调用这个插槽,我会有问题吗? 我问的原因是因为 QNAM 使它在不同的线程中调用,这可能会同时发出 2-5 个“finished()”信号,这将调用同时处理该信号的插槽? 就像,我不太确定那时会发生什么。请注意,我的代码都没有线程化,理论上信号应该排队吗?并且插槽会被调用5次,一个接一个?
谢谢
c++ - QNetworkAccessManager 析构函数是否中止当前请求?
在用户应该能够取消所有上传的应用程序上工作。现在我想知道我是否必须追查 QNAM 的所有回复,或者只是删除它并期望它们全部中止?
文档中没有任何关于中止的说明,但我假设它会。
销毁 QNetworkAccessManager 对象并释放所有资源。请注意,从此类返回的 QNetworkReply 对象将此对象设置为它们的父对象,这意味着如果您不对它们调用 QObject::setParent(),它们将与它一起被删除。
编辑:最终为每个回复使用一个包装器(它也接管它并重试等),它在其析构函数中既断开 QNetworkReplys 信号又中止它。它与包装器一起被删除(父->子)
c++ - 中止回复因访问冲突而崩溃
我有一个大问题,我实际上认为我解决了它。我有一个使用 QNetworkAccessManager 的应用程序。这个 QNAM 位于一个类中。当我在这个 QNAM 上执行请求时,所有这些请求都在一个包装器中完成,该包装器包含回复并对其进行重试逻辑
例如,如果我在构造函数中有一个 putBlob(它继承自 baseRequest),我会传递一个对 QNAM 的引用。我在它上面执行请求并保存一个指向回复的指针。然后回复将是包装子,因此 QNAM 不再拥有它的所有权。包装器是持有 QNAM 的原始类的子级。
类有一个 QNAM,和子“putBlobRequest”,它有子“QNetworkReply*”
现在的问题是当用户想要取消应该删除主对象及其中的所有内容时。包装器还应该中止它的 QNetworkReply 并断开连接(这样它就不会调用 finish())
我在 baseRequest 上的析构函数(它包含 QNetworkReply 并且是它的父级)如下所示:
当包装器在持有它的类中被杀死时,删除就完成了。(对吗?)
这有时有效,但有时我会遇到巨大的访问冲突,并且所有内容都因以下调用堆栈而崩溃:
所以首先 abort() 被调用,它调用以下内容:
这将我带到 QOBject.cpp 中的第 2891 行:
它因错误而崩溃的地方:
CloudSync.exe 中 0x66c2c490 (QtCored4.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xdddddddd。
地址“0xdddddddd”是“发送者”。
为什么发送者对象不可读?我究竟做错了什么?请帮忙!
编辑:
也试过:
我还断开了导出的 putBlob 中的 uploadProgress。也尝试过不断开连接,但同样的问题是违反了“发件人”
c++ - 如何创建一个假的 QNetworkAccessManager
有点问题。我目前有一个要测试的大型项目,其中大部分是否完全取决于 QNetworkAccessManager 实际响应调用的方式。由于我不能真正手动坐下并拔出以太网线以获得我想要的结果,所以我想制作一个假 QNAM。通常,我只会派生出与类派生出的相同接口,然后告诉使用它的对象有一个基类指针,这样它就可以毫不费力地处理假的和正确的。
然而!Qt 并没有真正做接口,QNAM 只继承自 QOobject,我真的不想对我的代码那么松散,只是告诉类对 QObject 进行所有调用(它没有虚拟 put、post 或任何东西)。这将需要在类内进行太多的代码更改(强制转换,两个不同的对象,具体取决于我们将注入的对象 etc..etc..) 我将如何实际解决这个问题?
查看了请求的分支更改 QtMock 但由于缺乏文档,我无法启动并运行它。
此外,开始从 QNAM dervie,但由于我使用 arent virtual 的方法,它不会拿起我的。
我的班级看起来像这样:
然后它将使用 QNAM 执行 REST 请求并检查何时完成。
那么,我怎么能做一个假的 QNAM,我可以插入到这个代码中,而不必做太多的改变呢?有什么好的设计模式或任何可以解决这个问题的方法吗?
c++ - 无法在 Visual Studio 中构建 QtMock
刚刚下载了https://qt.gitorious.org/~niandong/qt/niandongs-qttools/commits/qtmock,因为我迫切需要模拟 QNetworkAccessManager。
我能够使用 Qt 4.7.4 在 QtCreator 2.3.1 中构建 qtmock.pro。所有测试都按预期运行,我非常兴奋!
然后我必须使用 Visual Studio 构建它才能使用我的项目的库及其所有依赖项。我在 Visual Studio 2010 pro 中使用 Qt 4.8。我导入了主要的 qtmock.pro,首先我尝试构建仅包含框架的底层 qtmock 项目(没有测试或任何东西)。它构建得很好,我得到了一个 .lib 和 .dll 文件。然后我尝试构建 qtnetworkstub.pro,其中 QNetwork 的所有模拟对象都是我的项目所需的。以下是我的构建命令行:
/OUT:"......\lib\qtnetworkmock.dll" /NOLOGO /LIBPATH:"E:\QT\4.8.0\lib" /LIBPATH:"e:\QT\4.8.0\lib" / LIBPATH:"../../../lib" /DLL "../../../lib\qtmock.lib" "E:\QT\4.8.0\lib\QtTestd4.lib" "E :\QT\4.8.0\lib\QtCored4.lib""kernel32.lib""user32.lib""gdi32.lib""winspool.lib""comdlg32.lib""advapi32.lib""shell32.lib"" ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Win32\qtnetworkmock.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker ' uiAccess='false'" /DEBUG /PDB:"E:.Qt.UnitTest\qtmock\lib\qtnetworkmock.pdb" /PGD:"E:\src\Qt.UnitTest\qtmock\lib\qtnetworkmock.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
我只使用 testLib 和 Core。
然后我收到以下链接错误:
我没有得到的是:我没有使用任何这些对象,并且在该项目的任何地方都没有引用它们。它们都继承自 QIODevice,但我不太确定这有多大帮助。
我非常卡住,我会很感激任何帮助,因为我真的很想使用这个框架(它对于单元测试来说似乎真的很棒!)
qt - 是否可以通过 Qt Webkit 提交 ajax 表单?
我正在开发一个 Qt 应用程序,其中包含一个作为 HTML 页面的 OpenStreetMap 应用程序,并且该页面能够访问数据库——通过提交一个包含查询开始和结束日期的 ajax 表单——以便检索和可视化查询地图。我想将此查询过程从 HTML/Javascript 部分移至 Qt。是否可以通过 Qt Webkit 的 evaluateJavaScript 函数来做到这一点,或者我应该使用 QNetworkAccessManager 吗?我已经尝试了 evaluateJavaScript 方式,但到目前为止,我还无法将我的查询发送到数据库——尽管从显示警报框的 html 文件中调用一些虚拟 js 函数有效——。
python - TypeError:本机 Qt 信号不可调用
我正在尝试向受保护的网页发出请求,因此我尝试在QAuthenticator()
. 但是,我收到以下错误:
这是我的脚本的一部分:
我在这里做错了什么?