QNetworkAccessManager读取outgoingData并将其保存在QIODevice中

时间:2011-03-27 16:29:59

标签: qt qt4 qtwebkit

我试图在QtWebKit中保存所有传出的POST数据。

我使用覆盖 QNetworkReply * QNetworkAccessManager :: createRequest(操作op,const QNetworkRequest& request,QIODevice outgoingData) 方法并读取包含传出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;

但在这种情况下,我得到了&#34; QIODevice :: write:ReadOnly device&#34;消息。

如何在Qt中保存传出的POST / PUT数据?

感谢。

3 个答案:

答案 0 :(得分:2)

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

  

从中读取最多maxSize个字节   设备转换成数据,没有副作用   (即,如果你之后调用read()   peek(),你会得到相同的数据)。   返回读取的字节数。如果   发生错误,例如何时发生   试图窥视打开的设备   WriteOnly模式,此函数返回   -1

     当没有更多数据时,返回

0   可供阅读。

编辑

忘记峰值(),在这种情况下并不好。你可以使用它,但你必须做很多工作来完成你的要求。而是阅读Tee is for Tubes,从那里获取代码并使用它。

来自http://irc.freenode.net上#qt irc频道的 peppe 提供的链接。 我要感谢 peppe thiago ,他们非常友好地在#qt频道与我讨论这个问题。

如果有一天你想从QNetworkAccessManager 窃取传入(而不是传出)数据,你会在How to read data from QNetworkReply being used by QWebPage?问题中找到答案和代码。

答案 1 :(得分: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;
    }
}

要进行优化,您可以调整&#39; delta&#39;。

的值

答案 2 :(得分:0)

使用QIODevice::pos()保存IO设备标记。从中读取数据。然后使用QIODevice::seek()恢复标记。

这仅在设备是随机访问设备时才有效。但我认为它涵盖了大部分内容。