java等价于perl URI::QueryParam模块
java中是否有用于解析url查询参数的等效库 为了说明我想要什么,我发送了一个代码示例:java等价于perl URI::QueryParam模块,java,perl,url,Java,Perl,Url,java中是否有用于解析url查询参数的等效库 为了说明我想要什么,我发送了一个代码示例: 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) {
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&c=d
a:b
c:d
我不喜欢编写自己的查询片段解析函数。java.net.URL和
java.net.URI
有什么问题?不完全是这样,但接近:
final URI uri = URI.create(inputString);
final String[] queryParams = uri.getQuery().split("&");
然后在queryParams
的每个元素上再次拆分
注意:不要直接使用
urldecker
对查询片段的值进行解码;它将把+
变成空格(pchar
包含子delim
包含+
!)
一个接近的解决办法是:
URLDecoder.decode(param.replace("+", "%2b"), "UTF-8")
要编码,请使用番石榴的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
它没有什么问题,但它只提供了带有getQuery函数的查询字符串。然后我必须编写自己的函数来解析它。我们还必须记住,有些参数有多个值。@DavidMichaelGang,看看fge给出的答案和我对他的答案的评论。这将为您提供完整的解决方案。(+1),然后使用
urldecker
对使用%及其代码编码的非便携符号进行解码。不,我刚刚尝试过这个方法getQuery()
不解码任何内容。它尝试了aaa+bbb
和aaa%20bbb
,但都没有解码就返回了。此外,它甚至无法解码,因为URL不仅仅用于HTTP URL。理论上,它适用于任何类型的URL,而参数编码的这种语法是特定于HTTP的。@fge,Re“.getQuery()
将为您解码所有这些”,这是不可能的getQuery
必然返回仍然编码的查询,因为组件可能包含&
和=
。您的解决方案不完整。@fge,Re“urldecker
用于表单数据,而不是URI查询字符串组件”,这是错误的。它不是针对(所有)表单,而是针对查询字符串。它用于解析application/x-www-form-urlencoded
字符串,查询字符串和一些(但不是全部)表单使用该字符串。@ikegami URI组件要解码(尤其是编码)的字符列表与application/x-www-form-urlencoded