Qt QDesktopServices::openUrl-使用post值启动浏览器

Qt QDesktopServices::openUrl - launch browser with post values

本文关键字:启动 post 浏览器 使用 QDesktopServices openUrl- Qt      更新时间:2023-10-16

我正在尝试编写一个简单的应用程序,该应用程序将启动浏览器并根据用户的输入将其发送到URL

QDesktopServices::openUrl(QUrl(url));

但是,我希望将变量与他们使用POST提交的任何URL一起传递。对于GET,我所需要做的只是简单地将值嵌入到URL字符串中,但我该如何添加POST变量呢?。

谢谢。

QDesktopServices并不是为此而设计的,我建议您使用QNetworkAccessManager::post进行HTTP POST。

如果必要的话,您可以从HTTP响应中获取一些信息来打开桌面浏览器。

来自官方文档:

bool QDesktopServices::openUrl(const QUrl&url)[static]

在用户桌面环境的相应Web浏览器中打开给定的url,如果成功,则返回true;否则返回false。

如果URL是对本地文件的引用(即URL方案是"文件"),那么它将用合适的应用程序而不是Web浏览器打开。

简单的回答是,它不是一个网络管理员。为此,人们已经可以使用QNetworkAccessManager了。这只是添加对打开URL的支持的一种方便方式,因为否则需要做很多工作。它没有进一步的计划来更紧密地复制QtNetwork

因此,我建议使用这样的东西来实现与给定url的post方法的工作:

QUrlQuery urlQuery;
urlQuery.addQueryItem("param1", "value1");
urlQuery.addQueryItem("param2", "value2");
QUrl url = QUrl("http://foo.com");
QNetworkRequest networkRequest(url);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
networkManager->post(networkRequest, urlQuery.toString(QUrl::FullyEncoded).toUtf8());

如果维护外部web服务没有问题,可以设置GET到POST重定向服务(因为QDesktopService::openUrl可以毫无问题地将url查询字符串传递给浏览器)。在使用此路由时,需要记住的两件事是:a)根据某种白名单正确验证服务收到的请求,以避免源于开放http重定向的安全问题;b)考虑用户桌面浏览器和处理重定向的服务器的URL长度限制。

如果我们忽略IE和边缘,桌面网络浏览器似乎能够处理32k字节长或更好的URL(从快速网络搜索中获得的数据可能不准确)。如果你也瞄准了较旧的安卓手机,则长度限制降至8k。

另一种方法是使用CCD_ 11,其不会遭受与CCD_ 12相同的缺陷:https://doc.qt.io/archives/qt-5.5/qwebview.html#load-1。唯一的问题是它需要使用webkitwidgets模块,这对您来说可能是问题,也可能不是问题。

附带说明:我还在努力寻找解决QDesktopServices问题的方法。如果您找到了通过用户默认浏览器发送POST请求的更好方法,请将其发布在此处,以便其他人受益。

干杯。