我正在尝试编写一个简单的应用程序,它将启动浏览器并URL
根据用户的输入将其发送到。
QDesktopServices::openUrl(QUrl(url));
但是,我想传递变量以及URL
他们使用POST
. 对于GET
,我需要做的只是将值嵌入到URL
字符串中,但是我将如何添加POST
变量呢?
谢谢。
我正在尝试编写一个简单的应用程序,它将启动浏览器并URL
根据用户的输入将其发送到。
QDesktopServices::openUrl(QUrl(url));
但是,我想传递变量以及URL
他们使用POST
. 对于GET
,我需要做的只是将值嵌入到URL
字符串中,但是我将如何添加POST
变量呢?
谢谢。
QDesktopServices 不是为此而设计的,我建议您QNetworkAccessManager::post
改为使用 HTTP POST。
然后,如果有必要,您可以从 HTTP 响应中获取一些信息来打开桌面浏览器。
从官方文档:
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());
如果您在维护外部 Web 服务方面没有问题,您可以设置一个 GET-to-POST 重定向服务(因为QDesktopService::openUrl
可以毫无问题地将 url 查询字符串传递给浏览器)。走这条路线时要记住两件事:a)根据某种白名单正确验证服务收到的请求,以避免由开放 http 重定向引起的安全问题,以及 b)考虑用户桌面的 URL 长度限制处理重定向的浏览器和服务器。
如果我们忽略 IE 和 edge,桌面网络浏览器似乎能够处理 32k 字节或更好的 URL(从快速网络搜索获得的数字可能不准确)。如果您还针对较旧的 Android 手机,则长度限制会降至 8k。
另一种方法是使用QWebView
它不会遭受与以下相同的缺陷QDesktopServices
:https ://doc.qt.io/archives/qt-5.5/qwebview.html#load-1 。唯一的问题是它需要使用webkitwidgets
模块,这对您来说可能是也可能不是问题。
旁注:我还在努力寻找解决 QDesktopServices 问题的方法。如果您找到了通过用户默认浏览器发送 POST 请求的更好方法,请在此处发布,以便其他人受益。
干杯。