Как заменить определенные «&» в строке URL для синтаксического анализа

Строка URL может быть очень динамичной. Он может иметь любое количество и комбинацию параметров. Например :

  myHost?parm1=Data1&parm2=Data2&parm3=Data3

Большинство подпрограмм синтаксического анализа могут быть прекрасно реализованы в этом сценарии, но что, если сами данные содержат '&'. Например :

  myHost?parm1=Data1&1b&parm2=Data2&2b&parm3=Data3&3b

Использование StringTokenizer или URLEncoder — это процесс «все или ничего». Поскольку имена параметров могут различаться, их нельзя использовать как часть поиска. Пары значений имен должны быть разбиты, а данные, содержащие «&», должны быть сохранены как таковые:

parm1=Data1&1b
parm2=Data2&2b
parm3=Data3&3b

Любая рекомендация Java по реализации для этого?


person Unhandled Exception    schedule 16.12.2015    source источник


Ответы (2)


& в значениях строки запроса должны быть процентно закодированы, как %26. В вашем примере они должны выглядеть так:

parm1=Data1%261b
parm2=Data2%262b
parm3=Data3%263b

Таким образом, должно быть легко разделить правильно закодированный URL-адрес, просто используя &.

При создании URL-адреса клиентская программа должна кодировать URL-адресом каждое значение параметра. Затем отформатируйте URL-адрес, объединив ключ и (закодированное) значение с помощью = и список пар ключ-значение с помощью &. Если клиентская программа не кодирует значения параметров в URL-адресе, то серверная программа не сможет отличить встроенный & от разделителя значений &.

person janos    schedule 16.12.2015
comment
Означает ли это, что ожидается, что пользователь сам введет %26, когда данные содержат «&», но затем использует «&» в других местах URL-адреса? - person Unhandled Exception; 18.12.2015
comment
Клиентская программа несет ответственность за правильное кодирование & - person janos; 18.12.2015
comment
Все, что я видел, по сути, выполняет тип кодирования «все или ничего», и когда это делается, вы все равно не можете различить «&» внутри данных и «&», который разделяет данные. - person Unhandled Exception; 18.12.2015
comment
При создании URL-адреса клиентская программа должна кодировать URL-адресом каждое значение параметра. Затем отформатируйте URL-адрес, объединив ключ и (закодированное) значение с помощью = и список пар ключ-значение с помощью &. Если клиентская программа не кодирует значения параметров в URL-адресе, то серверная программа не сможет отличить встроенный & от разделителя значений &. - person janos; 18.12.2015
comment
Там может быть 1000 различных параметров. Основываясь на ответе, вы указываете, что клиентское приложение отслеживает все более 1000 параметров, извлекает пару «имя-значение», а затем кодирует? - person Unhandled Exception; 18.12.2015
comment
Нет. Я говорю о клиентском приложении, которое использует пары «имя-значение» в каком-то словаре или форме в качестве входных данных. Вход в источнике. Логика программы, которая преобразует пары имя-значение в плоскую строку, является моментом времени, когда значения должны быть закодированы в URL-адресе, прежде чем помещать их в плоскую строку. Именно во время этого преобразования следует применять URL-кодирование. - person janos; 18.12.2015
comment
Если я следую, по сути, клиентское приложение должно знать, какие доступные параметры можно использовать. Если это так, то это определенно не настроено в настоящее время. В настоящее время клиентское приложение просто передает URL-адрес. Поскольку может быть около 1000 различных параметров, как они обычно хранятся? В файле, в базе данных или в файле свойств? - person Unhandled Exception; 23.12.2015

В Java есть утилита, которая кодирует URL-адреса для вас (java.net.URLEncoder), и она должна позаботиться о замене амперсанда.
Вот сообщение, похожее на ваше.

Кроме того, вы можете прочитать о некоторых статьи, которые дают советы по кодированию URL.

person Gabriel Ruiu    schedule 16.12.2015
comment
Я видел этот пример, и если я что-то не пропустил, он будет обрабатывать все символы «&», а не только те, которые связаны с данными. - person Unhandled Exception; 18.12.2015