URL-адрес QNetworkRequest, содержащий '?' - некорректный запрос из-за кодировки QUrl

У меня есть следующий код для запроса:

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...*/
}

Запрошенный URL должен быть

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-адрес с помощью url.toString() и просто URL-адреса, но '?' продолжает путаться. Что я могу сделать, чтобы правильно запросить ссылку?

Я попытался создать QUrl в конструкторе следующим образом:

URL-адрес QUrl("https://"+host+port+connectionString);

Но в результате получается следующая строка:

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


person Victor    schedule 28.05.2014    source источник
comment
но эта веб-страница недоступна   -  person 4pie0    schedule 28.05.2014
comment
Что ж, мне нужно держать это в секрете, веб-страница не какая-то веб-страница.домен, это что-то вроде google.com, и я попробовал URL-адрес, и он работает.   -  person Victor    schedule 28.05.2014
comment
попробуйте req.setRawHeader(POST,url.path().toAscii())   -  person 4pie0    schedule 28.05.2014
comment
@bits_international Хорошо, попробовал и получил ту же проблему. Я пытался использовать url.toAscii(), но ничего не решил.   -  person Victor    schedule 28.05.2014
comment
Почему вы кодируете URL-адрес с помощью url.setUrl(url.toEncoded()); ?   -  person Matthias    schedule 28.05.2014
comment
@user3514760 user3514760 Когда я это делал, я занимался отладкой. Раньше это был url.toString(), и при отладке я обнаружил, что при печати url.toEncoded() печатается '?', поэтому я оставил его там, но это не имеет значения. Хотя это описано выше.   -  person Victor    schedule 28.05.2014
comment
URL-адрес QUrl = QUrl::fromEncoded(somewebpage.domain:443/REST/login. php?method=login_md5);   -  person 4pie0    schedule 28.05.2014
comment
QByteArray rawQuery (метод = login_md5); URL-адрес QUrl (somewebpage.domain:443/REST/login.php); url.setEncodedQuery (rawQuery); std::cout ‹‹ command.toEncoded().data(); // печатает somewebpage.domain:443/REST/login.php?method=login_md5   -  person 4pie0    schedule 28.05.2014
comment
@bits_international печатает его правильно, и я думаю, что это правильно, но я получаю следующее: Error: "Protocol "" is unknown" и если я отвечаю-›url(), чтобы проверить URL-адрес, я получаю QUrl( "" ), так что я не уверен, это один шаг вперед или назад   -  person Victor    schedule 28.05.2014
comment
последний вариант QUrl(QString::fromUtf8(QByteArray)); ИЛИ QUrl url = QUrl::fromEncoded(str.toAscii());   -  person 4pie0    schedule 28.05.2014
comment
@bits_international Я продолжаю получать одни и те же ошибки, либо Protocol "" is unknown", либо not found. Я также попробовал url.setUrl(QUrl::fromPercentEncoding(url.toEncoded())); и печатает его хорошо, но выдает неизвестную ошибку протокола :( большое спасибо за ваше время и помощь, хотя   -  person Victor    schedule 28.05.2014
comment
@ Виктор посмотрите здесь   -  person 4pie0    schedule 28.05.2014
comment
@bits_international Я это видел. И, кстати, я только что заметил очень странное неопределенное поведение в приложении: хотя оно продолжает выдавать эти неизвестные ошибки протокола, оно как будто ему удается войти, но только на полпути, потому что оно как будто продолжает пытаться войти, но я делаю есть возможность выйти из системы, так что это очень странно. Я бы сказал, что проблема решена, вы можете ответить на вопрос, самый простой и быстрый способ «решить ее» был url.setUrl(QUrl::fromPercentEncoding(url.toEncoded()));   -  person Victor    schedule 28.05.2014
comment
@ Виктор, нет проблем, я отправил ответ   -  person 4pie0    schedule 28.05.2014


Ответы (3)


Вы можете попробовать QUrl::fromEncoded

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

Анализирует ввод и возвращает соответствующий QUrl. предполагается, что ввод осуществляется в закодированной форме, содержащей только символы ASCII.

для правильной обработки символов.

person 4pie0    schedule 28.05.2014
comment
Это был действительно ответ, другие, которые вы предоставили, тоже работали, но этот был лучше. Оказывается, было много других модулей, которые пропустили исправление. - person Victor; 28.05.2014

Закодированный URL-адрес кажется действительным, возможно, проблема с вашим веб-сервером?

person LtWorf    schedule 29.05.2014

Вы можете установитьPath() и setQuery() отдельно. Что стоит перед '?' это путь, а после аргументы запроса.

const QStringList path_part = path.split('?');
url.setPath(path_part.at(0));
if(path_part.size() > 1)
    url.setQuery(path_part.at(1));
person Jerome Godbout Amotus    schedule 28.09.2018