Russian Qt Forum

Qt => Работа с сетью => Тема начата: thechicho от Июнь 11, 2013, 15:51



Название: Автоматическое преобразование %2B в %252B
Отправлено: thechicho от Июнь 11, 2013, 15:51
нужно выполнить запрос на
http://www.blabla.ru/?blabla%2Bblabla

задаю так
request.setUrl(QUrl("http://www.blabla.ru/?blabla%2Bblabla"));

по сниферу видно, что
%2B автоматически кодируется в %252B
вопрос: где происходит это кодирование и возможно ли его оключить?

или

%2B - это символ +
если задать урл http://www.blabla.ru/?blabla+blabla
то ничего не кодируется, а так и передается. хотя в данном случае мне нужно, чтобы прошло кодирование + в %2B


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: mutineer от Июнь 11, 2013, 15:54
QUrl::toPercentEncoding подойдет?


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: thechicho от Июнь 11, 2013, 16:03
вот похожая проблема
http://www.qtcentre.org/threads/54183-QNetworkAccessManager-strange-problem-and-behavior

только мне нужно, чтобы именно %2B отправлялось в итоговом запросе

//QUrl::toPercentEncoding
нет, это QNetworkAccessManager как-то автоматически кодирует %2B в %252B
что нужно отключить, либо включить кодирование + в %2B


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: kambala от Июнь 11, 2013, 16:58
request.setUrl(QUrl::toPercentEncoding("http://www.blabla.ru/?blabla+blabla"));


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: thechicho от Июнь 11, 2013, 17:13
QByteArray QUrl::toPercentEncoding ( const QString & input, const QByteArray & exclude = QByteArray(), const QByteArray & include = QByteArray() ) [static]
void QNetworkRequest::setUrl ( const QUrl & url )

но это неважно. важно то, что % автоматически кодируется в %25
и из %2B получается %252B

это на уровне исходников происходит? (типа баг)
или все-таки как-то можно повлиять на это преобразование?


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: Serr500 от Июнь 11, 2013, 19:07
Вставьте вместо "%2B" символ "+" и передайте строку в QUrl.


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: thechicho от Июнь 11, 2013, 19:13
Цитировать
если задать урл http://www.blabla.ru/?blabla+blabla
то ничего не кодируется, а так и передается. хотя в данном случае мне нужно, чтобы прошло кодирование + в %2B


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: thechicho от Июнь 11, 2013, 19:17
http://lists.qt.nokia.com/public/qt-interest/2008-December/000569.html


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: thechicho от Июнь 11, 2013, 22:48
в общем в 4 Qt баг с QUrl.
в чем именно он заключается я хз, но если
делать так
QString urlString = "http://www.blabla.ru/?blabla+blabla";
request.setUrl(QUrl(urlString));
то сервер сообщает об ошибке

если так
request.setUrl(QUrl::fromEncoded(urlString.replace("+", "%2B").toUtf8()));
то сервер отдает нужный контент.

помог разобраться thiago с irq FreeNode, Europe канал #qt (походу этот чувак https://www.google.ru/search?q=Thiago+Macieira)
посоветовал переходить на qt5, мол там QUrl без багов и работает быстрее)

заходите тоже, можно будет на русском поообщаться)
http://qt-project.org/wiki/OnlineCommunities

можно через оперу зайти irc:
ищите FreeNode, Europe комнату qt


Название: Re: Автоматическое преобразование %2B в %252B
Отправлено: thechicho от Июнь 12, 2013, 14:32
может кому интересно будет
Код:
QString urlString = "http://www.blabla.ru/?blabla%2Bblabla";
QUrl urlTest1(urlString);
qDebug() << endl << "urlTest1" << urlTest1;
qDebug() << "urlTest1.toEncoded()" << urlTest1.toEncoded();

QUrl urlTest2 = QUrl::fromEncoded(urlString.toUtf8());
qDebug() << endl << "urlTest2" << urlTest2;
qDebug() << "urlTest2.toEncoded()" << urlTest2.toEncoded();

urlTest1  QUrl( "http://www.blabla.ru/?blabla%2Bblabla" )  
urlTest1.toEncoded() "http://www.blabla.ru/?blabla%252Bblabla"

urlTest2  QUrl( "http://www.blabla.ru/?blabla+blabla" )  
urlTest2.toEncoded() "http://www.blabla.ru/?blabla%2Bblabla"