如何从我自己的 QtWebKit 应用程序中读取“发送”的 POST 数据?我正在开发一个小型混合 QWebKit 应用程序,它使用 HTML 表单进行用户输入,然后执行本地 Perl 脚本并显示最终结果。实际上没有任何东西发送到服务器或从服务器检索,也没有执行实际的网络通信;HTML 表单只是脚本的本地接口。
我已经尝试了一个解决方案,灵感来自
Piotr Dobrogost “如何告诉 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();
我还发现并阅读了以下堆栈溢出问题:
1.“QNetworkReply - 建立连接,写入第一个字节等”,
2.“QtWebKit QWebPage::acceptNavigationRequest 和 POST 数据”,
3.“QNetworkAccessManager 读取输出数据并将其保存在 QIODevice ”,
以及 qt-project.org 论坛上的一篇有趣的帖子:
4.“ [已解决] QNetWorkRequest ”
,但没有一个答案为我提供了一个可行的解决方案。
如果没有找到更简单的解决方案(没有外部类),可能会测试由 Piotr Dobrogost 在问题 Nr 中提出的 Grantlee::Tee 解决方案。3.
如果可能,我想避免使用 Webkit Bridge 解决方案,例如 Qt Form Extractor Example,这使得我的应用程序依赖于在每个 HTML 表单中插入特定的 JavaScript 代码(更不用说许多表单是使用 jQuery / AJAX 提交的,他们期望来自浏览器的正常 POST 功能)。
每一个帮助、建议、信息,尤其是工作代码片段都将受到高度赞赏!