QT: Мне было интересно, есть ли способ создать объект QUrl или другой объект класса URL из строки без кодирования окончательного URL. Например, вот фрагмент моего кода:
QString GetJsonStringFromURL(QString url) //url == "192.168.0.111/controller?POSITION|03|100"{
QEventLoop eventLoop;
QNetworkAccessManager mgr;
QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
QNetworkRequest req( QUrl::fromUserInput(url) ) ;
QNetworkReply *reply = mgr.get(req);
eventLoop.exec(); //wait till reply finished
QString strReply = reply->readAll();
return strReply;
}
Этот код обращается к контроллеру локальной сети, запрашивая его json с помощью метода get, при передаче параметра в URL. URL, который я передаю, кодируется в процентах:
«192.168.0.111/controller?POSITION%7C03%7C100»
чего я пытаюсь избежать. Сервер, к которому я пытаюсь получить доступ, представляет собой нестандартную часть аппаратного обеспечения с микропрограммой, написанной на C, которая не включает в себя процентное декодирование. Я хотел бы избежать обслуживания на стороне сервера. Я попытался просмотреть ссылку на класс QUrl, но ни один из доступных методов не дал желаемого результата.
Это невозможно с QNetworkRequest
поскольку для каждого запроса требуется объект QUrl, который хранит место назначения и внутренне преобразуется в закодированную строку.
setRawHeader не работает для вас, так как он может установить все заголовки HTTP, кроме как из URL, который является частью запроса GET.
Подтвердите формат необработанного HTTP-заголовка curl -v http://stackoverflow.com/questions/
GET /questions/ HTTP/1.1
User-Agent: curl/7.37.1
Host: stackoverflow.com
Accept: */*
Таким образом, вам нужен полностью сырой розетка (с которым у меня нет опыта).
Qurl имеет функцию декодирования. Посмотрите на QUrl :: decode (), иначе вы можете предотвратить кодирование при передаче его с помощью QUrl :: fromPercentEncoding (url.toEncoded ()), но вы можете потерять некоторую целостность строк, если у вас есть сложные строки запроса.
Я лично не использовал это, но я хотел бы опубликовать, как вы упомянули, вы не могли найти что-либо в справочнике класса.