【问题标题】:How do I add array parameters to an url using Uri.Builder?如何使用 Uri.Builder 将数组参数添加到 url?
【发布时间】:2014-10-18 17:31:08
【问题描述】:

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

【问题讨论】:

    标签: java android uri uribuilder


    【解决方案1】:

    不是“所有 URL 都是 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 中。 “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,那么您的具体问题的答案仍然是否。

    【讨论】:

    • 我猜? API 文档表明确实如此。这将与文档中给出的示例一致。 I think your best choice (and time saver choice) is to change your parameters name - 我无法控制后端。
    • 我的应用连接到的 API。
    • 嗯,在后端应该有一个 URI 解码器,它将%5B%5D 转换为[],所以你构建 URI 的方式是正确的。如果没有这样的解码器,您应该向维护 API 的人投诉。您根本无法将 [] 直接放入您的 URI。
    • 好的,那就这样吧:) 谢谢。
    【解决方案2】:

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

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

    编辑

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

    也许给出一个“正确”URI 的示例并描述它可能如何被某些代码使用。

    【讨论】:

    • and use one of the setters that doesn't encoded chars - 那会是哪个二传手?
    • 我会检查 API 文档以了解您正在使用的 SDK 版本。虽然我要补充一点,双编码参数只是维护的噩梦。我不喜欢我的回答。
    • 在我问这个问题之前我做过:developer.android.com/reference/android/net/Uri.Builder.html - 我看不到任何帮助
    • Maybe give an example of a "correct" URI and describe how it might be consumed by some code. - 正确的 URI 已经在我的问题中了。这是?array_name[]=value1&array_name[]=value2。后端将其解析为一个名为 array_name 的数组,包含两个值:value1value2
    • 然后决定数组的名称是什么并将其用作参数名称。然后让后端知道它需要接受“my_param_name”并将其视为一个数组(经过适当数量的输入清理!)
    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2015-04-24
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多