QT: QUrl без процентной кодировки

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/контроллер?ПОЗИЦИЯ%7C03%7C100"

которого я пытаюсь избежать. Сервер, к которому я пытаюсь получить доступ, представляет собой специальное оборудование с прошивкой, написанной на C, которая не включает процентное декодирование. Я хотел бы избежать обслуживания на стороне сервера. Я попытался просмотреть ссылку на класс QUrl, но ни один из доступных методов не дал желаемого результата.


person Nikša Skeledžija    schedule 11.11.2014    source источник


Ответы (2)


Это невозможно с 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: */*

Таким образом, вам нужно полностью сырое сокетное соединение (с которым у меня нет опыта ).

person Simon Warta    schedule 11.11.2014
comment
Спасибо, после двух дней исследований я отказываюсь от этого и меняю нестандартный URL-адрес, поскольку кажется, что вы правы, независимо от того, что я пытаюсь, класс QUrl анализирует и кодирует строку, используя стандартные соглашения об URL-адресах. . - person Nikša Skeledžija; 11.11.2014
comment
Хорошо :) Тогда я был бы признателен за голосование и принятие этих ответов. - person Simon Warta; 11.11.2014
comment
Я принял ответ, но моя репутация слишком низкая, чтобы поддержать :) - person Nikša Skeledžija; 11.11.2014

В Qurl есть функция декодирования. Посмотрите на QUrl::decode(), иначе вы можете предотвратить кодирование при его передаче с помощью QUrl::fromPercentEncoding(url.toEncoded()), но вы можете потерять некоторую целостность строки, если у вас есть сложные строки запроса.

Я лично не использовал это, но я бы написал, как вы упомянули, что вы ничего не можете найти в справочнике по классам.

person IsakBosman    schedule 11.11.2014
comment
Я видел эти методы и тестировал их, ни один из них не дал желаемого результата. :( Теперь я попытался использовать fromPercentEncoding, и все же строка снова закодирована. Я предполагаю, что этот формат URL требуется сетевым классам, поэтому он не допускает неправильных форматов. - person Nikša Skeledžija; 11.11.2014