【问题标题】:QNetworkRequest URL containing '?' - not requesting properly because of QUrl encoding包含“?”的 QNetworkRequest URL - 由于 QUrl 编码而无法正确请求
【发布时间】:2014-07-17 09:34:45
【问题描述】:

我有下一个发出请求的代码:

void HTTPClient::post(QString connectionString, QHttpMultiPart* _multiPart, bool returnProgress) {
    QUrl url;
    if (ssl)
        url.setScheme("https");
    else
        url.setScheme("http");
    url.setHost(host);
    url.setPort(port);
    url.setPath(connectionString);
    url.setUrl(url.toEncoded());
    QNetworkRequest request(url);
    request.setRawHeader("User-Agent", QCoreApplication::applicationName().toLatin1());

    /*...irrelevant code...*/
}

请求的网址应该是

https://somewebpage.domain:443/REST/login.php?method=login_md5

但是 QNetworkRequest 请求这个,尽管我将 url 设置为编码(调试 url.toEncoded() 正确打印'?'):

https://somewebpage.domain:443/REST/login.php%3Fmethod=login_md5

这会导致 404 未找到页面。我试过用 url.toString() 设置 url,只是 url,但是 '?'一直在搞砸。我该怎么做才能正确请求链接?

我尝试在构造函数中构建 QUrl,如下所示:

QUrl url("https://"+host+port+connectionString);

但结果是下一个字符串:

https://somewebpage.xn--domain-efa/REST/login.php?method=login_md5

【问题讨论】:

  • 但是这个网页不可用
  • 好吧,我需要保密,网页不是 somewebpage.domain,它类似于 google.com,我已经尝试了 url,它确实有效
  • 试试 req.setRawHeader("POST",url.path().toAscii())
  • QByteArray rawQuery("method=login_md5"); QUrl url("somewebpage.domain:443/REST/login.php"); url.setEncodedQuery(rawQuery); std::cout somewebpage.domain:443/REST/login.php?method=login_md5
  • 最后一个选项 QUrl(QString::fromUtf8(QByteArray));或 QUrl url = QUrl::fromEncoded(str.toAscii());

标签: c++ qt encoding qnetworkrequest


【解决方案1】:

你可以试试QUrl::fromEncoded

url.setUrl(QUrl::fromPercentEncoding(url.toEncoded()));

解析输入并返回相应的 QUrl。输入被假定为 采用编码形式,仅包含 ASCII 字符。

正确处理字符。

【讨论】:

  • 这确实是答案,您提供的其他答案也确实有效,但这个更好。事实证明,还有很多其他模块错过了更正。
【解决方案2】:

编码后的 URL 似乎有效,可能是您的网络服务器有问题?

【讨论】:

    【解决方案3】:

    您可以分别设置路径()和设置查询()。 “?”之前是什么?是路径,之后是查询参数。

    const QStringList path_part = path.split('?');
    url.setPath(path_part.at(0));
    if(path_part.size() > 1)
        url.setQuery(path_part.at(1));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2018-12-09
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      相关资源
      最近更新 更多