Qt QDesktopServices :: openUrl - 启动带有帖子值的浏览器

时间:2014-10-24 18:11:46

标签: c++ qt qtcore qtnetwork qdesktopservices

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

QDesktopServices::openUrl(QUrl(url));

但是,我想使用URL传递变量及其提交的POST。 对于GET,我只需要将值嵌入到URL字符串中,但我该如何添加POST个变量?

感谢。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

来自official documentation

  

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

     

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

     

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

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

因此,我建议使用这样的东西来实现使用你的网址的帖子方法:

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());

答案 2 :(得分:0)

如果维护外部Web服务没有问题,则可以设置GET-to-POST重定向服务(因为QDesktopService::openUrl可以将URL查询字符串毫无问题地传递给浏览器)。使用此方法时,要牢记两件事:a)针对某种白名单正确验证服务接收的请求,以避免由于开放的http重定向而引起的安全问题; b)考虑两个用户桌面的URL长度限制浏览器和服务器处理重定向。

如果我们忽略IE和Edge,则桌面Web浏览器似乎可以处理长度为32,000字节或更好的URL(通过快速Web搜索获得的数字可能不准确)。如果您还定位较早的android手机,则长度限制将降至8k。

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

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

干杯。