QNetworkReply 没有得到任何标题

Posted

技术标签:

【中文标题】QNetworkReply 没有得到任何标题【英文标题】:QNetworkReply does not get any headers 【发布时间】:2013-09-27 14:08:47 【问题描述】:

我正在编写一个应用程序来获取我必须在其上发送 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);

我得到一个无效的变体对象,对于标题也是如此。

如何获取响应的原始数据包?这对于这种情况会很方便。

我还注意到我的嗅探器上的连接重复了 3 次,并且每次都发送请求,只有一个 put 请求;这可能是图书馆的问题吗?

【问题讨论】:

你的意思是你得到了 QMetaType::Unknown?另外,您使用的是哪个qt版本?顺便说一句,你能提供一个独立的例子吗?详情请查看 sscce.org。 是的,这就是我得到的 QVariant,我使用的是 Qt 5.1.1。 ...代码没有太多内容,除了 get 请求可以正常工作,但 put 请求的行为方式与我描述的一样,我猜设备存在问题,如果我对此无能为力可以像使用 QTcpSocket 一样获得原始数据,这会很好 您是否检查了错误信号以防万一,或者一般的错误(字符串)?另外,请提供一些代码,硬件参考等。否则,帮助有点困难。 是的,来自 QNetworkReply 的错误信号和 errorString 也表示连接已关闭(错误代码 2)。我正在 VirtualBox 上开发 Ubuntu 12.04,我将编辑问题以添加基本代码 tnxs! 初始代码块中的 QNetworkReply 应该是 QNetworkRequest?您是否尝试过使用正确的 URL,即192.168.1.100? 【参考方案1】:

我必须对 QNetworkAccessManager 类进行子类化以使用 QTCpSocket 实现我的自定义 put 方法以获得适当的响应,我无法创建 QNetworkReply 并将值设置为属性,因此应用了一些解决方法:P 当然QTcpSocket的readyRead信号连接到这个类的socketRead槽,错误信号也连接到其他槽

.h

#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);

【讨论】:

以上是关于QNetworkReply 没有得到任何标题的主要内容,如果未能解决你的问题,请参考以下文章

错误:QNetworkReply:没有这样的文件或目录

QEventLoop 没有同步等待 QNetworkReply 完成

Qt Jambi:访问 QNetworkReply 的内容

QNetworkReply 不触发

如何制作自己的自定义 QNetworkReply?

使用 QNetworkAccessManager 从 Web 检索数据:文件已下载但 QNetworkReply::readAll 返回 null