QNetworkAccessManager считывает outgoingData и хранит его в QIODevice - PullRequest
2 голосов
/ 27 марта 2011

Я пытаюсь сохранить все исходящие данные POST в QtWebKit.

Я делаю это, используя переопределение QNetworkReply * QNetworkAccessManager :: createRequest (Операция op, const QNetworkRequest & request, QIODevice outgoingData) и считывая исходящие данные, содержащие исходящие данные 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».

Как сохранить исходящие данные POST / PUT в Qt?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

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

Считывает не более maxSize байтов с устройства в данные без побочных эффектов (т. Е. Если вывызовите read () после peek (), вы получите те же данные).Возвращает количество прочитанных байтов.Если возникает ошибка, например, при попытке просмотреть устройство, открытое в режиме WriteOnly, эта функция возвращает -1.

0 возвращается, когда больше нет данных для чтения.

РЕДАКТИРОВАТЬ

Забудьте о пике (), это не хорошо в этой ситуации.Вы можете использовать его, но вам придется проделать большую работу, чтобы выполнить то, что вы просите.Вместо этого прочитайте Тройник предназначен для труб , возьмите код оттуда и используйте его.

Ссылка предоставлена ​​ peppe из канала #qt irc на http://irc.freenode.net.Я хотел бы поблагодарить peppe и thiago , которые были так любезны обсудить эту проблему на канале #qt со мной.

В случае, если однажды вы захотите украсть входящие (в отличие от исходящих) данные из QNetworkAccessManager. Ответ и код вы найдете в Как читать данные из QNetworkReply, используемые QWebPage? вопрос.

1 голос
/ 20 ноября 2015

Использование pos () и seek () на самом деле не работает в этом особом случае.Идея использования peek () вместо этого выглядит намного лучше.Но пример будет полезен.Итак, вот пример того, как получить буфер данных из исходящих данных данного QIODevice в функции createRequest (), не затрагивая исходные данные.

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'.

0 голосов
/ 27 марта 2011

Сохранить маркер устройства ввода-вывода с помощью QIODevice::pos().Прочитайте данные из этого.Затем восстановите маркер с помощью QIODevice::seek().

. Это будет работать, только если устройство имеет произвольный доступ.Но я думаю, что это охватывает большинство из них.

...