Я хотел бы кодировать только ключи запроса и параметры URL-адреса (не хотите кодировать /,? Или &). Какой лучший способ сделать это в Java?
Например, я хочу конвертировать
http://www.hello.com/bar/foo?a=,b &c =d
в
http://www.hello.com/bar/foo?a=%2Cb%20&c%20=d
Я собираюсь оставить фактическое кодирование компонентов как функцию, предоставляемую пользователем, потому что это существующая хорошо обсуждаемая проблема без тривиального решения JCL. В любом случае, следующим образом я хотел бы подойти к этой конкретной проблеме без использования сторонних библиотек.
Хотя регулярные выражения иногда приводят к двум проблемам, я не решаюсь предлагать более строгий подход, такой как URI, потому что я не знаю, как он будет - или даже если он будет - работать с такими фанковыми недопустимыми URL-адресами. Таким образом, это решение, использующее регулярное выражение с динамическим значением замены.
// The following pattern is pretty liberal on what it matches;
// It ought to work as long as there is no unencoded ?, =, or & in the URL
// but, being liberal, it will also match absolute garbage input.
Pattern p = Pattern.compile("\\b(\\w[^=?]*)=([^&]*)");
Matcher m = p.matcher("http://www.hello.com/bar/foo?a=,b &c =d");
StringBuffer sb = new StringBuffer();
while (m.find()) {
String key = m.group(1);
String value = m.group(2);
m.appendReplacement(sb,
encodeURIComponent(key) + "=" encodeURIComponent(value));
}
m.appendTail(sb);
См. Пример примера ideone с заполнением encodeURIComponent
.
Создайте URL-адрес примерно так:
String url = "http://www.hello.com/bar/foo?";
url += "a=" + URLEncoder.encode(value_of_a);
url += "&c=" + URLEncoder.encode(value_of_c);