java等价于perl URI::QueryParam模块

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) {

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) {
    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