我试图在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数据?
感谢。
答案 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()
恢复标记。
这仅在设备是随机访问设备时才有效。但我认为它涵盖了大部分内容。