如何从我自己的QtWebKit应用程序中读取“发送”的POST数据?我正在开发a small hybrid QWebKit application,它使用HTML表单进行用户输入,而不是执行本地Perl脚本并显示最终结果。实际上没有任何内容发送到服务器或从服务器检索,也没有执行实际的网络通信; HTML表单只是脚本的本地接口。
我已经尝试了一个灵感来自答案的解决方案
Piotr Dobrogost
“如何告诉QWebPage不要加载特定类型的资源?”和
FèlixGalindoAllué
“从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读取outgoingData并将其保存在QIODevice中”,
以及qt-project.org论坛上的一篇有趣帖子:
4.“[Solved] QNetWorkRequest”
但没有一个答案为我提供了有效的解决方案
如果没有找到更简单的解决方案(没有外部类),可能会测试由Piotr Dobrogost提出的Grar也许Tee解决方案。 3。
如果可能的话,我想避免像Qt Form Extractor Example这样的Webkit Bridge解决方案,它使我的应用程序依赖于在每个HTML表单中插入特定的JavaScript代码(更不用说使用jQuery / AJAX提交许多表单)他们期望从浏览器获得正常的POST功能。
每一份帮助,建议,信息以及特别是工作代码都将受到高度赞赏!
答案 0 :(得分:0)
我认为此代码有助于捕获发布的数据并在消息框中显示 - 您也将重复使用传出数据 - 正如您将看到的那样:
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;
}