HttpClient 2.0.Параметры "кодифицированы" - PullRequest
0 голосов
/ 16 февраля 2011

Я должен использовать HttpClient 2.0 (не могу использовать что-то более новое), и я сталкиваюсь с следующей проблемой. Когда я использую метод (в этом случае post), он «кодифицирует» параметры в шестнадцатеричный код ASCII, и «пробелы» превращаются в «+» (то, что получатель не хочет).

Кто-нибудь знает способ избежать этого?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Теоретически этого можно избежать, создав вручную строку запроса или тело запроса, содержащее параметры.

Но это будет плохой поступок , поскольку HTML, HTTP,Спецификации URL и URI мандат , что зарезервированные символы в параметрах запроса кодируются.И если вы нарушите это, вы можете обнаружить, что серверные HTTP-стеки, прокси-серверы и т. Д. Отклоняют ваши запросы как недействительные или ведут себя неправильно другими способами.

Правильный способ решения этой проблемы - это выполнить один из них.из следующих:

  • Если сервер реализован в технологии Java EE, используйте соответствующие методы API сервлета (например, ServletRequest.getParam(...)) для получения параметров запроса.Они позаботятся о любом декодировании для вас.

  • Если параметры являются частью строки запроса URL, вы можете создать экземпляр объекта Java URL или URI и использовать метод получения, чтобы вернуть вамзапрос с удаленной кодировкой.

  • Если ваш сервер реализован каким-либо другим способом (или если вам нужно , чтобы самостоятельно убрать строку запроса URL-адреса запроса или данные POST самостоятельно),затем используйте URLDecoder.decode или его эквивалент, чтобы удалить кодировку% и заменить + ... после того, как вы выяснили, где находятся границы запроса и параметров и т. д.

1 голос
/ 16 февраля 2011

Даже ваш браузер делает это, конвертируя пробел символ в +. Смотрите здесь http://download.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.html

Кодирует URL, преобразует в UTF-8 как строку.

При кодировании строки применяются следующие правила:

  • Буквенно-цифровые символы от «a» до «z», от «A» до «Z» и от «0» до «9» остаются неизменными.
  • Специальные символы ".", "-", "*" и "_" остаются прежними.
  • Символ пробела "" преобразуется в знак плюс "+".
  • Все остальные символы небезопасны и сначала преобразуются в один или несколько байтов с использованием некоторой схемы кодирования. Затем каждый байт представлен трехсимвольной строкой «% xy», где xy - шестнадцатеричное представление байта из двух цифр. Рекомендуемая схема кодирования - UTF-8. Однако из соображений совместимости, если кодировка не указана, используется кодировка платформы по умолчанию.

Также см. Здесь http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

  1. Имена и значения элементов управления экранированы. Символы пробела заменяются на +', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by% HH ', знак процента и две шестнадцатеричные цифры, представляющие код символа ASCII. Разрывы строк представляются в виде пар "CR LF" (то есть `% 0D% 0A ').

  2. Имена / значения элементов управления перечислены в порядке их появления в документе. Имя отделяется от значения =' and name/value pairs are separated from each other by & '.


Чтобы ответить на ваш вопрос, если вы не хотите кодировать. Я думаю, URLDecoder.decode поможет вам отменить закодированную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...