首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QNetworkReply不会获得任何标头

QNetworkReply不会获得任何标头
EN

Stack Overflow用户
提问于 2013-09-27 22:08:48
回答 1查看 1.5K关注 0票数 0

我正在编写一个应用程序来获取设备的信息,在这个设备上我必须像这样发送一个PUT请求:

代码语言:javascript
复制
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))):

我知道设备正在工作,因为它启动了它的进程,如果我在我的PC和设备之间放置一个嗅探器,我会看到响应。

485454502F312E3020323030204F4B200D0A或纯文本“HTTP/1.0 200 OK \r\n”

但是当执行slotRequestFinished(QNetworkReply* rep)插槽时,我没有得到任何数据、头部和属性,以及错误代码2(连接关闭)。

如果我执行:

代码语言:javascript
复制
QVariant attr = rep->attribute(QNetworkRequest::HttpStatusCodeAttribute);

我得到了一个无效的变量对象,头也是一样的。

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

我还注意到,在我的嗅探器上,连接重复了三次,并且每次只发送一个put请求;这会不会是库的问题?

EN

回答 1

Stack Overflow用户

发布于 2013-10-02 22:28:33

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

.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19052867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档