如何使用Uri.Builder将数组参数添加到URL?

时间:2014-08-25 14:21:08

标签: java android uri uribuilder

我需要使用数组参数生成一个url,或者看起来像这样:

?array_name[]=value1&array_name[]=value2

如何使用Uri.Builder实现此目标?以下代码:

Uri.Builder builder = new Uri.Builder();
builder.appendQueryParameter("array[]", "one");
builder.appendQueryParameter("array[]", "another");
String result = builder.build().toString();

获取此输出:

?array%5B%5D=one&array%5B%5D=another

转义哪个方括号。

如何获得我想要的结果?我不想完全抛弃Uri.Builder,因为解决方案已基于该类。

2 个答案:

答案 0 :(得分:2)

  

不是"所有网址都是URI"。这取决于RFC的解释。   例如,在Java中,URI解析器不喜欢[或]和那些   因为规范说"不应该"而不是"不得"

This means that square brackets can't be straightly added in a URI (without encoding).

  

" [IPv6主机地址]是方括号的唯一地方   URI语法中允许使用字符。"如果你在使用它们   正确的地方,java.net.URI接受他们。新   java.net.URI(" foo:// [1080:0:0:0:8:800:200C:417A] / a / b")为我成功   在Java 1.7中。 "富://example.com/a并[b]"错误。这听起来符合   RFC。表单新URI(" http"," example.com"," / a / b [c]!$&'()* +&# 34 ;,   null,null)将% - 编码[]。 java.net.URL接受它们   其他地方听起来似乎做了较少的验证

您真的需要使用array_name[]作为参数的名称吗?您希望通过?array_name[]=value1&array_name[]=value2完成什么?

我认为您最好的选择(节省时间)是更改您的参数名称。

您的URI构造正确。您将[]编码为%5B%5D,然后收到您请求的任何人都应对其进行解码。如果您可以将[]放入您的URI,那么您的具体问题仍然是答案。

答案 1 :(得分:0)

appendQueryBuilder()(可能)根据RFC 2396和朋友对字符串进行编码。方括号被视为“保留”字符,如果您要求编码字符串,则应对其进行编码。

也许您可以自己对参数进行双重编码,并使用其中一个不编码字符的setter,而是假设您已对其进行编码?

修改

等等,我真的不明白这应该是做什么的。你不想要独特的param键名吗?你不应该使用枚举或数组来保存用于创建密钥名称的字符串吗?

也许给出一个“正确”URI的例子,并描述一些代码如何使用它。