如何从QNetworkReply中读取内容(http响应正文)

时间:2014-08-05 15:26:31

标签: c++ qt response qwebview qnetworkreply

我使用qt5.3并在发布之前搜索了很多内容。

我想从QNetworkReply读取数据。我有QWebView,我还需要QWebView读取http响应才能显示网页。我需要的只是记录网页内容或对http帖子的任何回复。

问题是QNetworkReply只能读一次。

  1. 如果我选择readAll()信号时拨打readyRead(),我会获得完整的数据。但它会被清除,因此QWebView不会显示任何内容(它不会获得任何回复数据)。

  2. 或者,如果我选择finished()信号,因为数据已由QWebView(或QNetworkAccessManager)读取,如果我在这里拨打readAll(),我什么都得不到。是否存在QNetworkReply或经理或任何类别存储我仍然可以阅读的数据的地方?

  3. 在#1中,如果我拨打peek(),我可以获得部分数据。此功能不会清除响应数据。但如果反应机构很大,它就不会起作用。 QNetworkReply是一个连续的事情,我既不知道它的数据,也不能读取比缓冲更多。

    我不知道该怎么办.....

    我只想监视并记录我QWebView上发出的任何请求的请求和响应正文......

    编辑:请注意,我从响应中读取的数据大小只有1MB,因此无需进一步阅读即可查看整个数据。

1 个答案:

答案 0 :(得分:0)

您可以创建自己的QNetworkAccessManager子类并覆盖虚函数createRequest。调用基类实现以获取响应对象并将readyRead信号连接到将捕获数据的某个插槽。在那个插槽中调用peek函数读取数据,以便WebKit也可以获取数据:

class NetworkAccessManagerProxy : public QNetworkAccessManager {
Q_OBJECT

signals:

    void dataGot(QByteArray data);

public:
    NetworkAccessManagerProxy(QObject * parent = 0)
         : QNetworkAccessManager()
    {
    }

    virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice *outgoingData)
    {
        reply = QNetworkAccessManager::createRequest(op, request, outgoingData);
        connect(this,SIGNAL(readyRead()), SLOT(readInternal()));
        return reply;
    }

private slots:

     void readInternal()
     {
        QByteArray data = reply->peek(reply->bytesAvailable());
        emit dataGot(data);
     }

private:

    QNetworkReply* reply;
};

创建QWebPage对象后,调用setNetworkAccessManager并传递新创建的子类实例:

QWebPage * page = new QWebPage; 
page->setNetworkAccessManager(new NetworkAccessManagerProxy());
page->mainFrame()->load(url);

webView->setPage(page);