C++ 向url添加动态变量

C++ 向url添加动态变量,c++,qt,qt5,C++,Qt,Qt5,我想向url示例添加动态变量: QNetworkRequest req( QUrl( QString("http://website.com/?test=1&id=1") ) ); 但当我尝试这个: // the HTTP request varUrl = "http://website.com/?test="; varUrl += info; varUrl += "&id="; varUrl += info_2; QNetworkRequest req( QUrl( QSt

我想向url示例添加动态变量:

QNetworkRequest req( QUrl( QString("http://website.com/?test=1&id=1") ) );
但当我尝试这个:

// the HTTP request
varUrl = "http://website.com/?test=";
varUrl += info;
varUrl += "&id=";
varUrl += info_2;

QNetworkRequest req( QUrl( QString(varUrl) ) );
QNetworkReply *reply = mgr.get(req);
eventLoop.exec(); // blocks stack until "finished()" has been called
我得到这个错误:


您发布的错误消息部分是无关的。你的实际问题是:

QNetworkRequest req( QUrl( QString(varUrl) ) );
这被视为函数声明。这是C++中的一个角式案例,通常被称为“最令人烦恼的解析”。请参阅以获取解释

在任何情况下,都可以使用
QUrl::fromUserInput()
静态函数,而不是直接传递查询字符串。这将正确地编码查询(否则您需要手动正确地编码查询)。因此,简而言之,将上面的行更改为:

QNetworkRequest req(QUrl::fromUserInput(varUrl));
这也解决了解析问题;上述内容被正确地视为变量定义,而不是函数声明,您的代码现在应该可以正常编译了

作为旁注,您可以使用
QString::arg()
函数一次性构造字符串,而不必使用append(
+=
)操作。因此,您可以这样构造URL字符串:

varUrl = QString("http://website.com/?test=%1&id=%2").arg(info).arg(info_2);
%1
将替换为
info
的内容,而
%2
将替换为
info\u 2
的内容,具体如下:

QUrlQuery类提供了一种以成对方式操作键值的方法 URL的查询

它用于解析URL中的查询字符串,如 以下:

可能的解决方案是使用
QUrlQuery

QString info = "1";
QString info_2 = "1";
QUrl url("http://website.com/");
QUrlQuery query;
query.addQueryItem("test", info);
query.addQueryItem("id", info_2);
url.setQuery(query);

这是一个更好的方法。编码这些东西可能是一件非常痛苦的事情。@tadman您也可以使用
QUrl::fromUserInput()
静态函数来正确编码输入。是的,这也是一个选项,但看到作者如何构建url的代码,我认为这是一个更好的选项。困扰解析的现代解决方案:
QUrl{QString{varUrl}