2

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

我使用覆盖QNetworkReply *QNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevicegivingData )方法并读取包含传出 POST 数据的传出数据。

问题是读取后,数据在 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:ReadOnly device”消息。

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

谢谢。

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提供。我要感谢peppethiago,他们非常好心地在#qt 频道上与我讨论这个问题。

如果有一天您想从 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;
    }
}

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

于 2015-11-20T04:08:41.847 回答
0

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

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

于 2011-03-27T18:42:28.880 回答