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



我需要生成一个带有数组参数的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示例,并描述它如何被某些代码使用。

相关内容

  • 没有找到相关文章

最新更新