4

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

QDesktopServices::openUrl(QUrl(url));

但是,我想传递变量以及URL他们使用POST. 对于GET,我需要做的只是将值嵌入到URL字符串中,但是我将如何添加POST变量呢?

谢谢。

4

3 回答 3

3

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

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

于 2014-10-24T18:18:04.630 回答
1

官方文档

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

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

如果 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());
于 2014-10-25T01:55:31.363 回答
0

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

如果我们忽略 IE 和 edge,桌面网络浏览器似乎能够处理 32k 字节或更好的 URL(从快速网络搜索获得的数字可能不准确)。如果您还针对较旧的 Android 手机,则长度限制会降至 8k。

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

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

干杯。

于 2019-10-04T14:21:13.153 回答