QUrl逐段构建

QUrl construction piece by piece

我试着逐个构建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 实例的整个内部表示。

上述两种行为都正常吗?或者它们是错误?

我用的是Qt 5.7.1.

看来,简单的字符串连接不太容易出错。

至少回答您的一些问题:

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 并使用带有设置器的默认构造 QUrl 工作正常:

QUrl url;
url.setScheme("http");
url.setHost("server.com");
qDebug() << url; // QUrl("http://server.com")

setPath 使 URL 为 null 的原因是它的格式不正确。路径必须以斜杠开头。使用 url.setPath("/dir/file.htm");.

干杯,继续战斗!