从Java/Android的URL中获取参数名称集合

6

这真是太奇怪了,我找不到任何兼容的Java/Android URL解析器,可以返回完整的参数列表。

我已经找到了java.net.URL和android.net.Uri,但它们无法返回参数集合。

我想要传递url字符串,例如:

String url = "http://s3.amazonaws.com/?AWSAccessKeyId=123&Policy=456&Signature=789&key=asdasd&Content-Type=text/plain&acl=public-read&success_action_status=201";

SomeBestUrlParser parser = new SomeBestUrlParser(url);
String[] parameters = parser.getParameterNames();
// should prints array with following elements
// AWSAccessKeyId, Policy, Signature, key, Content-Type, acl, success_action_status

有没有人知道现成的解决方案?

5个回答

12

有一种方法可以获取所有参数名称的集合。

String url = "http://domain.com/page?parameter1=value1&parameter2=value2";
List<NameValuePair> parameters = URLEncodedUtils.parse(new URI(url));
for (NameValuePair p : parameters) {
    System.out.println(p.getName());
    System.out.println(p.getValue());
}

3
我遇到了编译时错误:"URLEncodedUtils" 类中的 "parse(HttpEntity)" 方法不适用于参数 "URI"。 - Gem
NameValuePair已经被弃用了,那么我们应该使用什么? - Ramesh Bhati

4

这个静态方法从给定的URL构建参数映射表

private Map<String, String> extractParamsFromURL(final String url) throws URISyntaxException {
    return new HashMap<String, String>() {{
        for(NameValuePair p : URLEncodedUtils.parse(new URI(url), "UTF-8")) 
            put(p.getName(), p.getValue());
    }};
}

usage

extractParamsFromURL(url).get("key")


3

0

UrlQuerySanitizer 在 API 级别 1 中添加

        UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(url_string);
        List<UrlQuerySanitizer.ParameterValuePair> list =  sanitizer.getParameterList();
        for (UrlQuerySanitizer.ParameterValuePair pair : list) {
            System.out.println(pair.mParameter);
            System.out.println(pair.mValue);
        }

0

urllib 库将解析查询字符串参数,并允许您将参数作为列表或映射访问。如果可能存在重复键,请使用列表,否则映射非常方便。

给定此片段:

String raw = "http://s3.amazonaws.com/?AWSAccessKeyId=123&Policy=456&Signature=789&key=asdasd&Content-Type=text/plain&acl=public-read&success_action_status=201";
Url url = Url.parse(raw);
System.out.println(url.query().asMap());
for (KeyValue param : url.query().params()) {
  System.out.println(param.key() + "=" + param.value());
}

输出结果为:

{Policy=456, success_action_status=201, Signature=789, AWSAccessKeyId=123, acl=public-read, key=asdasd, Content-Type=text/plain}
AWSAccessKeyId=123
Policy=456
Signature=789
key=asdasd
Content-Type=text/plain
acl=public-read
success_action_status=201

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接