我需要生成一个带有数组参数的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
,因为解决方案已经基于这个类。
不是"所有url都是uri "。这取决于对RFC的解释。例如,在Java中,URI解析器不喜欢[或],那就是因为规范说"不应该"而不是"不应该"
这意味着不能直接在URI中添加方括号(没有编码)。
"[IPv6主机地址]是唯一的地方,方括号字符在URI语法中是允许的。"如果你在在正确的地方,java.net.URI接受它们。新java.net.URI("foo://[1080:0:0:0:8:800:200C:417A]/a/b")对我来说成功了在Java 1.7中。"foo://example.com/a [b]"错误。这听起来符合RFC。形成新的URI("http"、"example.com"、"美元/a/b [c] !,’()* +",Null, Null)将对[]进行%-编码。那个java.net.URL接受它们其他地方听起来像是做了更少的验证
您真的需要使用array_name[]
作为您的参数名称吗?你到底想用?array_name[]=value1&array_name[]=value2
实现什么?
我认为你最好的选择(和节省时间的选择)是改变你的参数名称。
您的URI构造正确。您将[]
编码为%5B%5D
,然后接收您的请求的人应该解码它。如果您可以将[]
放入URI中,那么您的特定问题的答案仍然是no.
appendQueryBuilder()(可能)按照RFC 2396及其友项编码字符串。方括号被认为是"保留"字符,如果您要求编码字符串,则应该对其进行编码。
也许你可以自己对参数进行双重编码,并使用一个不编码字符的setter,而是假设你已经编码了它?
编辑等等,我不太明白这是干什么用的。您不想要唯一的参数键名吗?您不应该使用枚举或数组来保存用于生成键名的字符串吗?可以给出一个"正确的"URI示例,并描述它如何被某些代码使用。