2011-03-27 80 views
2

我试图将所有传出的POST数据保存在QtWebKit中。QNetworkAccessManager读取outgoingData并将其保存在QIODevice

我使用首要QNetworkReply * QNetworkAccessManager ::的createRequest它做(操作运算,常量QNetworkRequest &请求,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; 

但在这种情况下,我得到 “的QIODevice ::写:只读设备” 的消息。

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

谢谢。

+0

您可以添加到您的问题信息,你需要什么数据这个数据?给我们更广泛的图片。 – 2011-03-28 21:13:16

回答

2

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

读取最多MAXSIZE从 设备到数据字节,无副作用 (即,如果调用后 PEEK()阅读(),您将获得相同的数据)。 返回读取的字节数。如果 发生错误,例如 试图查看以 WriteOnly模式打开的设备,则此函数返回 -1。

当没有更多的数据是 可供阅读时返回0。

编辑

忘掉高峰(),这不是在这种情况下很好。你可以使用它,但你将不得不做很多工作来完成你所要求的。改为读取Tee is for Tubes,从那里抓取代码并使用它。

链接由提供peppe来自#qt irc频道http://irc.freenode.net。 我要感谢peppethiago谁是如此友善的在#qt频道与我讨论这个问题。

如果有一天你想来自QNetworkAccessManager的数据(而不是传出),你会发现在How to read data from QNetworkReply being used by QWebPage?问题的答案和代码。

+0

看起来像一个正确的解决方案,我做outgoingData-> peek(100000);我试图使用outgoingData-> size()来获取maxSize,但它总是返回0.如何获得数据的确切maxSize?或者一个随机的大数字是好的? – Zelid 2011-03-28 08:43:04

+0

有谁知道为什么peak()不是一个好的解决方案? – izyda 2015-08-25 20:00:46

+1

@izyda我不确定我写这篇文章时的意思,但是现在思考的问题似乎是:a)什么时候“偷看”数据可以被QtWebKit读取(称为*内部Qt操作*在问题中)以及b)如何跟踪被窥视的内容,换句话说,如何保持窥视数据与从QIODevice中读取并仍然存在的数据之间的同步。基本上要做到这一点,你必须创造一些非常类似于编辑中提到的'Grantlee :: Tee'的东西来回答我的问题。 – 2015-08-26 07:33:14

0

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

这只有在设备是随机存取设备时才有效。但我认为它涵盖了其中大部分。

+1

IO设备是Sequential。 pos()总是返回0 – Zelid 2011-03-27 19:17:47

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; 
    } 
} 

对于优化,您可以调整'delta'的值。

相关问题