QNetworkReply не получает никаких заголовков
Я пишу приложение, чтобы получить информацию об устройстве, на которое мне нужно отправить запрос PUT, например:
connect(&netman,SIGNAL(finished(QNetworkReply*)), this,
SLOT(reqFinished(QNetworkReply*)));
QByteArray data("0ABF0A25");
QNetworkRequest req(QUrl("http://192.168.1.100:8088"));
req.setHeader(QNetworkRequest::ContentLengthHeader,data.length());
QNetworkReply rep =netman.put(req,data);
connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this,
SLOT(errorSlot(QNetworkReply::NetworkError))):
Я знаю, что устройство работает, потому что оно запускает свой процесс, и если я помещаю сниффер между моим ПК и устройством, и я вижу ответ.
485454502F312E3020323030204F4B200D0A или в виде обычного текста "HTTP/1.0 200 OK \r\n"
но когда slotRequestFinished(QNetworkReply* rep)
слот выполнен, я не получаю никаких данных, никаких заголовков и атрибутов, а также код ошибки 2 (соединение закрыто).
Если я выполню:
QVariant attr = rep->attribute(QNetworkRequest::HttpStatusCodeAttribute);
Я получаю и неверный вариант объекта, то же самое для заголовков.
Как я могу получить необработанные пакеты ответа? Это было бы удобно для этого случая.
Я также заметил на своем анализаторе, что соединение повторяется три раза, и отправляет запрос все это время только для одного запроса; Может ли это быть проблемой с библиотекой?
1 ответ
Мне пришлось создать подкласс класса QNetworkAccessManager для реализации моего пользовательского метода put с использованием QTCpSocket, чтобы получить соответствующий ответ, я не могу создать QNetworkReply и установить значения для атрибутов, чтобы был применен небольшой обходной путь:P И, конечно, сигнал readyRead QTcpSocket подключен к гнезду socketRead этого класса, также сигналы ошибок подключены к другим слотам
.час
#include <QNetworkAccessManager>
#include <QTcpSocket>
class MyNetworkAccessManager : public QNetworkAccessManager
{
Q_OBJECT
public:
explicit MyNetworkAccessManager(QObject *parent = 0);
virtual void myPut(const QNetworkRequest &request, const QByteArray &data);
signals:
void dataReceived(QNetworkReply*,const QByteArray data);
public slots:
void socketRead();
private:
QTcpSocket socket;
};
.cpp
void MyNetworkAccessManager::MyNetworkAccessManager(const QNetworkRequest &request, const QByteArray &data)
{
QUrl url = request.url();
QString host = url.host();
int len = data.length();
int port = url.port();
QString path = url.path();
QByteArray reqba = QString("PUT %1 HTTP/1.1\r\n\
Content-Type: application/xml\r\n\
Content-Length: %2\r\n\
User-Agent: MyFooAgent/0.1\r\n\
Host: %3:%4\r\n\r\n").arg(path).arg(len).arg(host).arg(port).toUtf8();
socket.connectToHost(host, port, QIODevice::ReadWrite);
socket.waitForConnected();
socket.write(reqba + data);
}
void MyNetworkAccessManager::socketRead()
{
QByteArray data = socket.readAll();
socket.close();
int code = 0;
if(data.contains("200 OK"))
code = 200;
else if(data.contains("404 Not Found"))
code = 404;
//else if ..... foo
emit dataReceived(data,code);
}