【问题标题】:How can I read content (http response body) from a QNetworkReply如何从 QNetworkReply 读取内容(http 响应正文)
【发布时间】:2014-08-05 15:26:30
【问题描述】:

我正在使用 qt5.3,在发布之前我搜索了很多。

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

问题是QNetworkReply 只能读取一次。

  1. 如果我在选择readyRead() 信号时调用readAll(),我将获得完整的数据。但它会被清除,所以QWebView 什么都不显示(它不会得到任何回复数据)。

  2. 1234563 QNetworkReply、经理或任何班级是否在某个地方存储了我仍然可以读取的数据?

在#1 中,如果我调用peek(),我可以获得部分数据。此功能不会清除响应数据。但是如果响应体很大,它就行不通了。 QNetworkReply 是一个顺序的东西,我既不能知道它的数据,也不能读取比缓冲的更远的内容。

我不知道如何处理这个.....

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

编辑:请注意,我要从响应中读取的数据高达 1MB,因此不进一步阅读就无法查看整个数据。

【问题讨论】:

  • 您的第 1 点和第 2 点都源于您对如何使用 QNetworkReply 的误解。在编程中,没有只能读取一次的东西。要么缓冲它,要么不缓冲;您最终会丢失数据。

标签: c++ qt response qwebview qnetworkreply


【解决方案1】:

您可以创建自己的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);

【讨论】:

  • 这适用于回复数据较小的情况。我要读取的数据有 1MB 大,并且 bytesAvailable() 主要返回大约 10000 字节的值。
  • 我认为connect 语句应该是connect(reply,SIGNAL(readyRead()),this,SLOT(readInternal()))
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多