Как узнать, нужно ли кодировать параметр URL в Java - PullRequest
3 голосов
/ 08 октября 2008

Я пишу Java-приложение, которое принимает значения параметров URL, которые могут кодироваться или не кодироваться. Мне нужен простой способ определить, нужно ли мне кодировать строку параметра.

Другими словами, я хочу функцию boolean needsEncoding(String param), которая будет возвращать true, если я передам строку "foo@test.com", и false, если я передам "foo% 40test.com". Проблема этой идеи в том, что это неоднозначно. Как я узнаю, должен ли быть закодирован знак "%" в последней строке? Один из способов справиться с этим - изменить мой контракт - требовать, чтобы клиенты передавали некодированные строки, чтобы я знал, что мне всегда нужно их кодировать. Мысли? * * 1004

Ответы [ 5 ]

6 голосов
/ 08 октября 2008

Я думал, что поставлю это в качестве предлагаемого ответа, чтобы люди могли голосовать:

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

1 голос
/ 08 октября 2008

Как насчет декодирования строки и проверки, являются ли все различия между исходной и декодированной строками действительными URL-объектами.

0 голосов
/ 08 июня 2014

Вот мой обычный метод борьбы с этим. Во-первых, так как + является раздражающим особым случаем, я запрещаю его как часть кодирования. Если они ставят плюс, это плюс, если им нужен пробел, они могут нажать на эту большую полосу в нижней части клавиатуры. (И да, я сделал это как часть некоторых контрактов). Но на самом деле вы можете объяснить это, поскольку вы так усердно работаете для своего клиента, что им не нужно беспокоиться о его кодировании самостоятельно.

Затем я переписал java.net.URLDecoder.decode, чтобы убрать «+». (На самом деле это просто вопрос вырезания и вставки в любой класс утилит, который я использую для этого проекта, и удаления ~ 4 строк).

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

Итак, я получаю:

String properlyencodedstring = 
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8");

Единственный случай, когда для этого может потребоваться подстройка, это когда данные с большими группами URL-адресов необходимо вводить и обрабатывать, это то, что я переключаю свое предположение, использую input type="url" (с некоторым типом javascript polyfill для старых браузеры) и препроцессировать с .replaceAll("+", " "), так как в этом случае не будет пробелов. (И, по всей вероятности, вместо этого используйте java.net.URI)

0 голосов
/ 09 октября 2008

Вы можете использовать java.net.URLDecoder на входе и посмотреть, изменится ли он, сравнив входные и выходные значения String. Глядя на Javadocs для URLDecoder, он описывает бизнес-логику, которую он применяет к входной строке, чтобы определить, требуется ли ей декодирование URL.

Если вы ДОЛЖНЫ получить результат boolean и не хотите нести накладные расходы при попытке декодирования для получения этого результата boolean, вы всегда можете взломать исходный код класса URLDecoder и использовать тот же бизнес Логика, используемая для определения необходимости декодирования URL.

0 голосов
/ 08 октября 2008

Указывает, что строка была закодирована URL:

  1. Пробелов нет, но много плюсов.
  2. Все процентные знаки сопровождаются двумя цифрами.
  3. В нем нет символов, кроме a..b, A..B, 0..9, ".", "_", "-", "*", "%" и "+".

Однако я думаю, что изменение договора является рекомендуемым действием здесь.

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