gpt4 book ai didi

android - Uri.getQueryParameter() 不适用于 "["和 "]"符号

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:28 42 4
gpt4 key购买 nike

我有以下 URI:http://host/path?param1=1&param2[]=2&param3[1]=3

uri.getQueryParameterNames() 返回一个包含预期值 ["param1", "param2[]", "param3[1]"] 的数组。

但是当将这些值传递给 getQueryParameter 时,我得到:uri.getQueryParameter("param1") == "1"uri.getQueryParameter("param2[]") == nulluri.getQueryParameter("param3[1]") == null

我试过在没有括号部分的情况下传递参数名称,但它也不起作用。调用 getQueryParameters() 也不起作用。

谢谢你的帮助!

最佳答案

documentation 中所述, Uri 构建并解析符合 RFC 2396 的 URI 引用.

如果向下滚动到规范中的第 2.4.3 节,您会发现以下内容:

Other characters are excluded because gateways and other transport
agents are known to sometimes modify such characters, or they are
used as delimiters.

unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | ""`

Data corresponding to excluded characters must be escaped in order to be properly represented within a URI.

从代码的角度来看,Uri 有一个私有(private)方法来判断一个字符是否被允许——如果不允许,它将被编码。理论上,这应该为括号和其他特殊字符返回 false

/**
* Returns true if the given character is allowed.
*
* @param c character to check
* @param allow characters to allow
* @return true if the character is allowed or false if it should be
* encoded
*/
private static boolean isAllowed(char c, String allow) {
return (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c >= '0' && c <= '9')
|| "_-!.~'()*".indexOf(c) != NOT_FOUND
|| (allow != null && allow.indexOf(c) != NOT_FOUND);
}

话虽如此,现在我们到了有趣的部分。看起来 Uri.parse() 相当“懒惰”,因为它实际上并不对您提供的 uri 进行编码。在您的场景中,您可能正在通过调用构建 Uri:

Uri uri = Uri.parse("http://host/path?param1=1&param2[]=2&param3[1]=3");

然后当您开始对生成的 Uri 调用 getQueryParameter() 时,会发生的是支持数据(String)是 ' unencoded',但是您提供给这些方法的参数名称确实得到了编码。例如:

uri.getQueryParameter("param2[]")

实际上是:

uri.getQueryParameter("param2%5B%5D")

带有关键字 param2%5B%5D 的查询参数显然不存在于 Uri 中。

解决方案是确保首先对括号进行转义,或者使用 Uri.Builder。例如:

Uri uri = Uri.parse("http://host/path").buildUpon()
.appendQueryParameter("param1", "1")
.appendQueryParameter("param2[]", "2")
.appendQueryParameter("param3[1]", "3")
.build();

这将导致以下基础 uri:

http://host/path?param1=1&param2%5B%5D=2&param3%5B1%5D=3

然后您可以毫无问题地调用 uri.getQueryParameter("param3[1]"):它将返回 3


编辑:我收回关于 Uri.parse() 懒惰的说法。它的目的是这样的。正如 Javadoc 中明确提到的那样:

Creates a Uri which parses the given encoded URI string.

换句话说:您提供的用于解析的字符串应该已经正确编码。

关于android - Uri.getQueryParameter() 不适用于 "["和 "]"符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18281593/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com