問題タブ [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: 証明書は自己署名されており、信頼されていません
証明書が自己署名されている Web サービスに残りの要求を送信しようとしています。現時点では、URL と認証を設定してリクエストを作成しています。ヘッダーとしてのキー。次に、この ssl エラーを無視するように返信に伝えます。
実行すると、次のsslエラーが発生します。
9 - 証明書は自己署名されており、信頼されていません
続いてネットワーク エラー番号 6:
リクエストが次のメッセージで失敗しました: SSL ハンドシェイクに失敗しました
現時点では、すべてのエラーを無視しています。それが機能する唯一のものであるように思われるからです。汚い感じ。
誰かが私が間違っていることを知っていれば、本当に感謝しています!
編集:
変更:
しかし、それでも同じエラーが発生します...
c++ - スレッドを削除してもスレッド数が大幅に増加する
QNetworkAccessManager をすべて含む QOBJects があるアプリケーションを用意します。アプリケーションごとにのみオンにすることが提案されていることは承知していますが、同時に 6 つ以上の呼び出しを行っているため、このようにする必要がありました。だから、これが私がスレッドを開始する方法です。
すべてのスレッドは、リストへのインデックスから開始し、アップロードする必要があるものをフェッチして、約 5 つのステップ (QNetworkAccessManager での呼び出し) を続行できるようにします。アップロードする項目がなくなると、fileUploader は "finished()" を通知deleteFinishedThread
しdeleteFinishedUploader
ます。
また
これらは、完了時にスレッドを削除することを想定しています。
問題は、(たとえば) 1 つのファイルをアップロードして処理する 3 つのスレッドを開始するたびに、スレッド数が 8 ~ 10 増加することです。これは、アップロード プロセスを数回再開すると、スレッド カウントが約 5 から 100 になることを意味します。
私は何を間違っていますか?それとも、「Windows タスク マネージャー」を使用してこれを制御することが最大の問題ですか? 削除した QNAM からのすべての返信を処理しており、すべてが削除されたように見えますが、スレッド数が増え続けると頭を悩ませます...
編集: 私のファイルアップローダーでは、スタックに QNetworkAccessManager を持つヒープにオブジェクト (マネージャー) を作成します。fileuploader が削除されると、Manager で「deleteLater()」が呼び出されますが、削除されることはありません。Manager を削除して NULL に設定しようとしましたが、Manager がまだ完了していないため、アクセス違反が発生しました (QNetwork.dll が問題を報告したため、まだ実行されている QNAM 内の何かである必要があります)。アクセス違反が発生せず、オブジェクトが削除され、スレッド数が正常に戻ったとき。QNAM 内に存在し、範囲外になったときに QNAM を削除できないようにするものは何ですか? 代わりにヒープに QNAM を作成する必要がありますか? この段階では、deleteLater() を呼び出してもデストラクタは呼び出されていません...
また、ハンドル数を減らすにはどうすればよいですか?
c++ - シグナルとスロットを使用したファイルの増分アップロード
これを実装する前に、これが未定義の動作や競合状態につながるかどうかを確認したいと思います。
asure にファイルをアップロードするときは、ブロック単位で行う必要があります。5 つのブロックを並行してアップロードしたいのですが、それらはすべて同じファイルからデータを取得します。これは次のようになります。
アップローダの putBlock 関数では、呼び出しで QNetworkAccessManager を呼び出します。完了すると、失敗、成功、またはキャンセルされた場合にシグナルを blockId と共に送り返すので、どのブロックがアップロードされたかがわかります。
私の計画は、これらの信号をスロットにフェッチして、このブロックがアップロードされたことに注意する必要があり (ブロック リストを配置してこのブロブをファイナライズできるようにリストに配置します)、インデックスを 1 つ増やします (これは 5 から始まります)。 ) データの新しいチャンクを取得し、プロセス全体をやり直します。
私の問題は、そのうちの 2 つがまったく同時に終了した場合はどうなるかということです。ここではスレッドを扱っていませんが、HTTP 要求はデフォルトでスレッド化されているため、ここではどうなるのでしょうか? シグナルはキューに入れられていますか (または QueuedConnection を使用する必要がありますか)? スロットを並行して呼び出すことはできますか? これを行うより良い方法はありますか?
c++ - 同じスレッドでスロットを並行して呼び出すことはできますか?
これを行う方法を理解するのに問題があります。私が最初にやろうとしていることが何であるかを説明しようとします。
まず、読み取り専用ファイルを含むこのクラスがあります。このクラスは、この他のクラス(StorageProvider)を使用して、このファイルのブロックをアップロードします。そのクラスにはQNetworkAccessManagerが含まれています。ファイルのブロックをアップロードするときは、ブロックをStorageProviderクラスに送信し、StorageProviderクラスはQNAMに送信するRESTリクエストを使用します。QNetworkReplyが完了すると、StorageProviderはこれをアップローダーに通知します(そのブロックが完了したことを認識します)。
アップローダー->StorageProvider->QNetworkAccessManager->インターネット
これまでのところ良いですよね?StorageHandlerがQNAMで行った要求で完了したときにリッスンするスロットをアップローダーに配置するだけで済みます。
ただし、QNAMはHTTPを介して同時に6つのリクエストを実行できるため、StorageProviderがブロックで完了したことを通知し、一意のBlockIdがその信号に接続されて、アップローダーが許可されるようにすることを考えていました。実行されたブロックだけでなく、実行されたブロックを知ること。
これは、信号(blockId)がStorageProviderによって発行されるたびに呼び出されるスロットが、実行されたIDを保存してから、アップロードされていない新しいIDを探す必要があることを意味します(すでにアップロードされているIDのリストなので、ID(0 ... 1000)をステップスルーするときは、次のことも行う必要があります。1.ファイルのインデックスを4mb前方にプッシュします。2。既存のブロックのリストをチェックインします。の。
だから、私の質問は次のとおりです。アップロードできる次のスロットが見つかるまで「currentBlockId」を1つ増やすスロットがあり、「currentBlockId」* 4mb(インデックス)の位置になるまでファイルを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 と、子「QNetworkReply*」を持つ子「putBlobRequest」があります。
問題は、ユーザーがメイン オブジェクトとその中のすべてを削除するキャンセルを希望する場合です。ラッパーも 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などがない)に対してすべての呼び出しを実行するようにクラスに指示します。クラス内でコードを大幅に変更する必要があります(キャスト、注入するオブジェクトに応じて2つの異なるオブジェクトなど)。これを実際に解決するにはどうすればよいですか?
要求されたブランチ変更QtMockを確認しましたが、ドキュメントが不足しているため、起動して実行することができませんでした。
また、QNAMから派生し始めましたが、仮想を使用していない方法なので、それは私のものを取り上げませんでした。
私のクラスは次のようになります。
次に、QNAMを使用してRESTリクエストを実行し、終了したかどうかを確認します。
では、あまり変更せずにこのコードに挿入できる偽のQNAMをどのように実行できるでしょうか。これを解決できる素晴らしいデザインパターンや何かがありますか?
c++ - Visual Studio で QtMock をビルドできません
QNetworkAccessManager をモックする必要があるので、https://qt.gitorious.org/~niandong/qt/niandongs-qttools/commits/qtmockをダウンロードしました。
Qt 4.7.4 を使用して、QtCreator 2.3.1 で qtmock.pro をビルドできました。すべてのテストが正常に実行され、非常に興奮しました!
次に、プロジェクトのライブラリとそのすべての依存関係を使用できるように、Visual Studio でビルドする必要がありました。ここでは Visual Studio 2010 pro で Qt 4.8 を使用しています。メインの qtmock.pro をインポートし、最初に、フレームワークのみを含む (テストなどを含まない) 基礎となる qtmock プロジェクトをビルドしようとしました。それはうまく構築され、.lib と .dll ファイルを取得しました。次に、プロジェクトに必要な QNetwork のすべてのモック オブジェクトがある qtnetworkstub.pro をビルドしようとしました。以下は、ビルドのコマンドラインです。
/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 フォームを送信することは可能ですか?
OpenStreetMap アプリケーションを HTML ページとして含む Qt アプリケーションを開発しています。このページは、クエリの開始日と終了日を含む ajax フォームを送信してデータベースにアクセスし、地図。このクエリ プロセスを HTML/Javascript 部分から Qt に移動したいと考えています。Qt Webkit の evaluateJavaScript 関数を介してこれを行うことは可能ですか、または代わりに QNetworkAccessManager を使用する必要がありますか? 私はevaluateJavaScriptの方法を試しましたが、これまでのところクエリをデータベースに送信できませんでした-アラートボックスを表示するhtmlファイルからいくつかのダミーjs関数を呼び出していますが-.
python - TypeError: ネイティブ Qt シグナルは呼び出し可能ではありません
保護された Web ページにリクエストを送信しようとしているため、 の助けを借りて認証しようとしていますQAuthenticator()
。ただし、次のエラーが表示されます。
これは私のスクリプトの一部です:
ここで何が間違っていますか?