我正在尝试编写一个简单的应用程序,它将启动浏览器并根据用户的输入将其发送到URL
。
QDesktopServices::openUrl(QUrl(url));
但是,我想使用URL
传递变量及其提交的POST
。
对于GET
,我只需要将值嵌入到URL
字符串中,但我该如何添加POST
个变量?
感谢。
答案 0 :(得分:3)
QDesktopServices并非专为此而设计,我建议您使用QNetworkAccessManager::post
进行HTTP POST。
如果有必要,您可以从HTTP响应中获取一些信息以打开桌面浏览器。
答案 1 :(得分:1)
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
,它不会遭受与QDesktopServices
:https://doc.qt.io/archives/qt-5.5/qwebview.html#load-1相同的缺陷。唯一的问题是,它将需要使用webkitwidgets
模块,这可能对您来说可能不是问题。
侧面说明:我还在尝试寻找一种解决QDesktopServices问题的方法。如果您找到了一种通过用户默认浏览器发送POST请求的更好方法,请在此处发布它,以便其他人受益。
干杯。