Есть ли эквивалентная библиотека для синтаксического анализа параметров url-запроса в java?
Чтобы проиллюстрировать, что я хочу, отправьте пример кода:
use URI;
use URI::QueryParam;
$u = URI->new("http://www.google.com?a=b&c=d");
print $u->query,"\n"; # prints foo=1&foo=2&foo=3
for my $key ($u->query_param) {
print "$key: ", join(", ", $u->query_param($key)), "\n";
}
Выход:
а = Ь & с = д
a: b
CD
Мне не нравится писать собственные функции разбора фрагментов запроса.
Не совсем так, но близко к:
final URI uri = URI.create(inputString);
final String[] queryParams = uri.getQuery().split("&");
Затем вы снова разделите на "="
каждый элемент queryParams
.
ПРИМЕЧАНИЕ. НЕ используйте URLDecoder
непосредственно для декодирования значений фрагментов запроса; он превратится +
в пробелы, что неверно в соответствии с спецификацией URI (pchar
содержит sub-delim
содержит +
!)
Приближающимся решением будет:
URLDecoder.decode(param.replace("+", "%2b"), "UTF-8")
Чтобы закодировать, используйте Guava UrlPathSegmentEscaper
.
Демонстрация: этот простой принцип:
public static void main(final String... args)
throws UnsupportedEncodingException, URISyntaxException
{
System.out.println(URLDecoder.decode("a+b", "UTF-8"));
System.out.println(new URI("http", "foo.bar", "/baz", "op=a+b", null));
System.out.println(new URI("http", "foo.bar", "/baz", "op=a b", null));
}
печатает:
a b // WRONG!
http://foo.bar/baz?op=a+b
http://foo.bar/baz?op=a%20b
Что не так с java.net.URL
и java.net.URI
?
URLDecoder
для декодированияURLDecoder
символов, закодированных с использованием% и их кода.getQuery()
ничего не декодирует. Он пробовалaaa+bbb
иaaa%20bbb
и оба вернулись без декодирования. Более того, он даже не может декодировать, потому что URL-адрес не только для HTTP-URL. Он теоретически предназначен для любого типа URL, в то время как такой синтаксис кодирования параметров специфичен для HTTP.