0

我试图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是默认构造的,那么使用设置器我根本无法向其中添加任何内容。

在上面的代码中,如果我取消注释最后一行,则输出变为QUrl(""). 那就是QUrl::setPath清理QUrl实例的整个内部表示。

上述两种行为都正常吗?还是他们是虫子?

我使用 Qt 5.7.1。

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

4

1 回答 1

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 为空的原因是它的格式不正确。路径必须以斜杠开头。使用url.setPath("/dir/file.htm");.

干杯,继续战斗!

于 2017-04-25T19:50:58.880 回答