2

すべての送信POSTデータをQtWebKitに保存しようとしています。

QNetworkReply * QNetworkAccessManager :: createRequest(Operation op、const QNetworkRequest&request、QIODeviceoutgoingData メソッドをオーバーライドし、発信POSTデータを含むoutgoingDataを読み取ることでこれを行います。

問題は、それを読み取った後、データがQIODeviceで使用できなくなることです。

送信(PUT、POST)データを保存し、将来の内部Qt操作で使用できるようにするにはどうすればよいですか?

PUT / POSTデータを保存するために別のアプローチを使用する必要がある場合は、お知らせください。

コード例:

QNetworkReply *MyNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
{     
 QByteArray bArray = outgoingData->readAll();
 // save bArray (that contains POST outgoing data) somewhere
 // do other things, and outgoingData now has no data anymore, as it was already read to bArray 
}

私が試してみました

QByteArray bArray = outgoingData->readAll();
outgoingData->write(bArray);
qDebug() << bArray;

しかし、この場合、「QIODevice :: write:ReadOnlydevice」というメッセージが表示されます。

発信POST/PUTデータをQtに保存するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

2

qint64 QIODevice::peek (char * data, qint64 maxSize)

デバイスから最大で maxSize バイトをデータに読み込みます。副作用はありません (つまり、peek() の後に read() を呼び出すと、同じデータが得られます)。読み取ったバイト数を返します。WriteOnly モードで開かれたデバイスをピークしようとした場合など、エラーが発生した場合、この関数は -1 を返します。

読み取るデータがなくなると、0 が返されます。

編集

peak() のことは忘れてください。この状況では良くありません。あなたはそれを使うことができますが、あなたが求めていることを達成するために多くの仕事をしなければなりません. 代わりに、Tee is for Tubes を読み、そこからコードを取得して使用します。

http://irc.freenode.netの#qt irc チャネルからのpeppeの厚意によるリンク。#qt チャンネルでこの問題について話し合ってくれたpeppethiagoに感謝します。

ある日、QNetworkAccessManager から (送信ではなく) 受信データを盗みたい場合は、QWebPage で使用されている QNetworkReply からデータを読み取る方法で回答とコードを見つけることができます。質問。

于 2011-03-27T20:04:14.053 に答える
1

pos() と seek() を使用しても、実際にはその特殊なケースでは機能しません。代わりに peek() を使用するというアイデアは、はるかに優れているようです。しかし、例は役に立ちます。したがって、元のデータに影響を与えることなく、関数 createRequest() で指定された QIODevice の送信データからデータ バッファを取得する方法の例を次に示します。

if (outgoing != NULL)
{
    const qint64 delta = 100;

    qint64 length = delta;
    QByteArray array;

    while (true)
    {
        char *buffer = new char[length];
        qint64 count = outgoing->peek(buffer, length);

        if (count < length)
        {
            array = QByteArray(buffer, count);
            delete buffer;
            break;
        }

        length += delta;
        delete buffer;
    }
}

最適化のために、「デルタ」の値を調整できます。

于 2015-11-20T04:08:41.847 に答える
0

で IO デバイス マーカーを保存しますQIODevice::pos()。そこからデータを読み取ります。次に、 でマーカーを復元しますQIODevice::seek()

これは、デバイスがランダム アクセスの場合にのみ機能します。しかし、それはそれらのほとんどをカバーしていると思います。

于 2011-03-27T18:42:28.880 に答える