Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > HTTP POST запрос, проблема при кодировке параметра


Автор: unkis 13.12.2008, 21:16
Ребята у меня такая проблема, нужно организовать один POST запрос, это я реализую с помощью HTTP Client от Apache.

Проблема в том, что в параметре присутствует знак %, Который при передачи почему-то кодируется в %25.

Так вот как сказать что-бы при передачи ничего не кодировалось?

Автор: v2v 13.12.2008, 22:14
А где ошибка ? 25 - это ASCII код знака % , а знак % добавляет Http Client что бы указать серверу что дальше идёт ASCII код.

Автор: COVD 14.12.2008, 01:09
Просветите, а зачем в POST что-то надо кодировать? В GET - понятно, там параметры включены в строку адреса. Поскольку в параметре могут быть недопустимые для семантики адреса символы ( пробелы, .. ), то их заменяют на %..  

Практический совет - используйте сановский стандартный URLConnection. 

Автор: ivg 14.12.2008, 08:53
Цитата(COVD @  14.12.2008,  04:09 Найти цитируемый пост)
Просветите, а зачем в POST что-то надо кодировать?

В http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4 со спецификацией HTML при передаче данных форм с Content-Type: application/x-www-form-urlencoded

Автор: COVD 14.12.2008, 19:27
Спасибо, понятно. 

Тогда "что-бы при передачи ничего не кодировалось" надо просто указать другой Content-Type - text/html, например. 

PS. Все же, не ясно, зачем спецификация имеет Content-Type: application/x-www-form-urlencoded. Наверное, потому, что ввод из формы допускается отсылать на сервер также и методом GET. Если же POST используется, то вроде нет необходимости в кодировании: достаточно указать, что текст и тогда никаких проблем с определением конца строки и конца данных на сервере не возникает. Соответственно, нет необходимости использовать Content-Type: application/x-www-form-urlencoded в описании html - формы, если POST. 

Автор: ivg 14.12.2008, 21:17
Цитата(COVD @  14.12.2008,  22:27 Найти цитируемый пост)
Тогда "что-бы при передачи ничего не кодировалось" надо просто указать другой Content-Type - text/html, например

С точки зрения сервера это было бы логично. С другой стороны при передаче данных в теле HTTP сообщения заголовок Content-Type http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.2.1 быть указан:
Цитата

Any HTTP/1.1 message containing an entity-body SHOULD include a Content-Type header field defining the media type of that body.
 Ну а то что им оказался application/x-www-form-urlencoded и что при этом необходимо "urlencod'ить" имена и значения параметров - видимо исторически так сложилось, обратная совместимость и т.д. Изначально логика, по видимому, была в том, чтобы одним образом обрабатывать параметры и GET и POST запросов. Кстати в современной спецификации сервлетов она также присутствует. Что же касается конкретно HttpClient, то, чтобы избежать "urlencod'инга" лучше, по моему, использовать метод setRequestEntity() (в версиях 3.0-3.1), см. исходники.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)