Qt QDesktopServices::openUrl-使用post值启动浏览器
Qt QDesktopServices::openUrl - launch browser with post values
我正在尝试编写一个简单的应用程序,该应用程序将启动浏览器并根据用户的输入将其发送到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请求的更好方法,请将其发布在此处,以便其他人受益。
干杯。
- 如何创建一个空的全局类并在启动时实例化它
- 如何使用curlpp通过POST方法上传文件和json数据
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- 使用 std::string () const 函数启动线程或未来
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- 如何创建线程序列以按照启动顺序执行任务?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 在挂钩启动新线程时解除挂钩进程
- 程序无法启动,因为缺少 libmpc-3.dll
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- QSerialPort 在应用程序启动之前正在使用中
- 无法在 Arch Linux 中启动虚幻引擎 4
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 程序在使用 system() 启动另一个可执行文件时停止
- Qt 和 Android - 如何使用 Qandroidjniobject 启动相机
- Q没有管理权限的 exe 无法启动维护工具
- Qt QDesktopServices::openUrl-使用post值启动浏览器