我需要使用数组参数生成一个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
,因为解决方案已基于该类。
答案 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的例子,并描述一些代码如何使用它。