【问题标题】:How to read POST data "sent" from my own QtWebKit application?如何从我自己的 QtWebKit 应用程序中读取“发送”的 POST 数据?
【发布时间】:2013-12-17 17:29:58
【问题描述】:

如何读取我自己的 QtWebKit 应用程序“发送”的 POST 数据?我正在开发a small hybrid QWebKit application,它使用 HTML 表单进行用户输入,而不是执行本地 Perl 脚本并显示最终结果。实际上没有任何东西发送到服务器或从服务器检索,也没有执行实际的网络通信; HTML 表单只是脚本的本地接口。

我已经尝试了一个受
答案启发的解决方案 彼得·多布罗格斯特 “如何告诉 QWebPage 不加载特定类型的资源?”和
Fèlix Galindo Allué “从 Qt 应用程序获取原始数据包数据”:

# peb.h:
#include <QApplication>
#include <QUrl>
#include <QtWebKit/QWebPage>
#include <QtWebKit/QWebFrame>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QDebug>

class NAM : public QNetworkAccessManager {

    Q_OBJECT

protected:

    virtual QNetworkReply * createRequest ( Operation op,
                                            const QNetworkRequest &req,
                                            QIODevice *outgoingData = 0 ) {
        qDebug() << "Trying to read POST data...";
        QByteArray outgoingByteArray = outgoingData -> readAll();
        QString postData ( outgoingByteArray );
        qDebug() << "POST data" << postData;
        return QNetworkAccessManager::createRequest ( op, req );
    }
};

#peb.cpp
TopLevel::TopLevel()
    : QWebView ( 0 )
{
    main_page = new Page();
    setPage ( main_page );

    NAM *nam = new NAM();
    main_page -> setNetworkAccessManager ( nam );

在调试消息“尝试读取 POST 数据...”后,我的程序甚至没有显示 GUI 就崩溃了 最有可能的问题在于:

QByteArray outgoingByteArray = outgoingData -> readAll(); 

我还发现并阅读了以下 Stack Overflow 问题:
1.“QNetworkReply - 连接建立,第一个字节写入等”,
2.《QtWebKit QWebPage::acceptNavigationRequest 和 POST 数据》,
3.《QNetworkAccessManager 读取传出数据并保存在 QIODevice 中》,
以及 qt-project.org 论坛上的有趣帖子:
4.“[Solved] QNetWorkRequest
但没有一个答案为我提供了可行的解决方案。
如果没有找到更简单的解决方案(没有外部类),可能会测试由 Piotr Dobrogost 在问题 Nr 中提出的 Grantlee::Tee 解决方案。 3.

如果可能,我想避免使用 Webkit Bridge 解决方案,例如 Qt Form Extractor Example,这使得我的应用程序依赖于在每个 HTML 表单中插入特定的 JavaScript 代码(更不用说使用 jQuery / AJAX 提交的许多表单并且他们希望浏览器具有正常的 POST 功能)。

我们将非常感谢每一个帮助、建议、信息,尤其是工作代码片段!

【问题讨论】:

  • 你应该真的检查outgoingData不为NULL...
  • ` if ( 传出数据 -> 大小() > 0 ){ QByteArray 传出字节数组 = 传出数据 -> readAll(); QString postData(传出字节数组); qDebug()
  • 您仍然在取消引用 outgoingData 而没有先检查它是否为 NULL! 添加这样的检查:if (outgoingData) { outgoingData-&gt;foo(); }。另请记住,如果您从该设备读取数据,则内部不会为实际请求保留任何数据。
  • if ( outgoingData ){ QByteArray outgoingByteArray = outgoingData -&gt; readAll(); QString postData ( outgoingByteArray ); qDebug() &lt;&lt; "POST data:" &lt;&lt; postData; } 工作得很好,完全符合我的要求!谢谢佩佩!我知道在outgoingDataQIODevice 之间的readAll() 之后,请求中没有用户输入数据,但我的程序中的请求不会去任何地方 - 用户输入在程序中被捕获并且(将) 重定向到本地执行的脚本 - HTTP 仅用于从 HTML 表单中提取用户输入。再次感谢!

标签: qt post qnetworkaccessmanager qiodevice


【解决方案1】:

我认为这段代码将有助于捕获发布的数据并将其显示在消息框中——您也将重用传出数据——正如您将看到的:

class netaccess : public QNetworkAccessManager
{
    Q_OBJECT
public:
netaccess() {}
virtual ~netaccess() {}

QNetworkReply * createRequest(Operation op, const QNetworkRequest &req, QIODevice * outgoingData = 0){

  if(outgoingData){

 QByteArray barr = outgoingData->readAll();

    QBuffer * buff = new QBuffer(&barr);

    if (PostOperation == op){
 QMessageBox::information(NULL,"",QString(barr));

buff->open(QIODevice::ReadOnly);
  QNetworkReply * rep = QNetworkAccessManager::createRequest    (op,req,buff);
 buff->setParent(rep);
return  rep;

    }

}



   QNetworkReply * rep = QNetworkAccessManager::createRequest(op,req,NULL);

    return  rep;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 2020-12-23
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多