我试着一片片地构建QUrl:
QUrl url{"https://host.org/path"};
url.setScheme("http");
url.setPort(81);
url.setUserName("user");
url.setPassword("password");
url.setHost("server.com");
QUrlQuery urlQuery;
urlQuery.setQueryItems({{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}});
url.setQuery(urlQuery);
url.setFragment("fragment");
//url.setPath("dir/file.htm");
qDebug() << url;输出(密码在途中意外丢失):
QUrl("http://user@server.com:81/path?key1=value1&key2=value2&key3=value3#fragment")
首先,如果QUrl是默认构造的,那么使用setter我根本不能在其中添加任何内容。
在上面的代码中,如果我最后只删除一行注释,那么输出就变成QUrl("")。也就是说,QUrl::setPath清理了QUrl实例的整个内部表示。
这两种行为都正常吗?还是它们是虫子?
我使用QT5.7.1。
看起来,这个简单的字符串连接就不那么容易出错了。
发布于 2017-04-25 19:50:58
至少要回答你的一些问题:
qDebug() << url;吃了密码,这是一件好事。为什么?因为qDebug和朋友经常用来编写日志文件,在日志文件中甚至在控制台上设置密码都很糟糕,真的很糟糕。因此,默认情况下,qDebug会吃掉密码。如果需要的话,打电话给qDebug() << url.toString()。(你已被警告过;)
QUrl url("server.com"); url.setScheme("http");导致http:server.com的原因是,在QUrl url("server.com");中,"server.com“被解析并识别为路径,而不是主机。
我使用的是5.7.0,并使用默认构造的带有setter的QUrl可以很好地工作:
QUrl url;
url.setScheme("http");
url.setHost("server.com");
qDebug() << url; // QUrl("http://server.com")setPath使URL为空的原因是它的格式不正确。路径必须以斜杠开始。使用url.setPath("/dir/file.htm");。
干杯,继续战斗!
https://stackoverflow.com/questions/43618586
复制相似问题