4

我需要生成一个带有数组参数的 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完全放弃,因为解决方案已经基于该类。

4

2 回答 2

2

不是“所有 URL 都是 URI”。这取决于 RFC 的解释。例如,在 Java 中,URI 解析器不喜欢 [ 或 ],这是因为规范说“不应该”而不是“不应该”

这意味着方括号不能直接添加到 URI 中(没有编码)。

“[IPv6 主机地址] 是 URI 语法中唯一允许使用方括号字符的地方。” 如果你在正确的地方使用它们,java.net.URI 会接受它们。new java.net.URI("foo://[1080:0:0:0:8:800:200C:417A]/a/b") 在 Java 1.7 中为我成功。“foo://example.com/a[b]”错误。这听起来符合 RFC。形式 new URI("http", "example.com", "/a/b[c]!$&'()*+", null, null) 将对 [] 进行 % 编码。java.net.URL 在其他地方接受它们听起来像是在做更少的验证

您真的需要使用array_name[]作为参数的名称吗?你到底想达到什么目的?array_name[]=value1&array_name[]=value2

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

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

于 2014-08-25T14:44:53.310 回答
0

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

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

编辑

等等,我真的不明白这应该做什么。你不想要唯一的参数键名吗?您不应该使用枚举或数组来保存用于制作键名的字符串吗?

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

于 2014-08-25T14:37:04.103 回答