QNetworkReply readAll пуст, если есть код ошибки

Ответ QNetworkReply :: readAll пуст, если QNetworkReply :: error ()! = NoError. Это нормально?

У меня есть сервер Node + Express, который всегда отправляет подробное описание в случае, если статус http отличается от 200; Я не могу получить это описание из своей клиентской базы Qt в QNAM. Версия Qt - 5.3, ОС Win 7 64b.

Это мой код, правда, я не думаю, что это может помочь.

PendingRequest *Foo::sendMsg(QStandardItem *requestItem, HTTP_METHOD_ID method, QString path)
{
    PendingRequest *pReq = new PendingRequest(method);

    QString url = QString("https://%1:%2%3").arg(host, QString::number(port), path);
    QNetworkRequest qNetReq = QNetworkRequest(QUrl(url));

    //set headears
    qNetReq.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, HttpUserAgent);
    qNetReq.setRawHeader("Connection", "Keep-Alive");
    if(!credentials.isEmpty())
    {
        qNetReq.setRawHeader("Authorization", QByteArray("Basic ")+credentials);
    }
    if(!sessionId.isEmpty())
    {
        qNetReq.setRawHeader("Session-Id", sessionId);
    }

    //send request
    QNetworkReply *reply;
    if(method == HTTP_METHOD_ID::POST)
    {
        qNetReq.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json");
        QByteArray data = outHandlerList[outHandlerIndex](requestItem);
        reply = netManager.post(qNetReq, data);
    }
    else
    {
        reply = netManager.get(qNetReq);
    }

    connect(reply, SIGNAL(finished()), this, SLOT(handleResponse()));
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(handleSslErrors(QList<QSslError>)));

    return pReq;
}

и здесь я обрабатываю ответ:

void Foo::handleResponse()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());

    if(reply->hasRawHeader("Session-Id"))
        sessionId = reply->rawHeader("Session-Id");

    PendingRequest *pReq = pendingRequestMap.contains(reply) ? pendingRequestMap.take(reply) : 0;
    Q_ASSERT(pReq);

    QStandardItem *responseItem = 0;
    QString error;

    if(reply->error() != QNetworkReply::NoError)
    {
        qDebug() << "readAll: ", reply->readAll(), "error: ", reply->errorString();
        error = reply->errorString();
    }
    else
    {
        responseItem = inHandlerList[pReq->inHandlerIndex](reply, error, pReq);
    }

    reply->deleteLater();
}

Спасибо большое за вашу помощь.


person Yovanis Santiesteban Alganza    schedule 08.09.2014    source источник
comment
Разместите пожалуйста код, как вы отправляете запрос и получаете данные? Это может быть полезно.   -  person Kosovan    schedule 09.09.2014


Ответы (1)


Из документации:

QByteArray QIODevice :: readAll ()

Это перегруженная функция.

Читает все доступные данные с устройства и возвращает их как QByteArray.

Эта функция не имеет возможности сообщать об ошибках; возврат пустого QByteArray () может означать либо то, что данные в настоящее время недоступны для чтения, либо что произошла ошибка .

person mhcuervo    schedule 09.09.2014
comment
Это перегруженная функция, я думаю, это скорее ошибка в документе ... в QIODevice есть только одна функция readAll, read - перегруженная. - person Yovanis Santiesteban Alganza; 09.09.2014
comment
Но суть не в этом. Как я могу изменить это поведение, я имею в виду, заставить QNetworkReply читать все полученные данные, ДАЖЕ ЕСЛИ статус http не равен 200 OK? - person Yovanis Santiesteban Alganza; 09.09.2014
comment
@YovanisSantiestebanAlganza Удалось ли вам найти решение? - person Victor Polevoy; 27.09.2016
comment
Нет, теперь я использую Http-заголовок Reason (атрибут reply- ›(QNetworkRequest :: HttpReasonPhraseAttribute) .toString ()). - person Yovanis Santiesteban Alganza; 29.09.2016