我有以下Uri:http:// host/path?param1 = 1¶m2 [] = 2¶m3 [1] = 3
uri.getQueryParameterNames()返回一个值为["param1","param2 []","param3 [1]"]的数组,这是预期的.
但是当将这些值传递给getQueryParameter时,我得到:uri.getQueryParameter("param1")=="1"uri.getQueryParameter("param2 []")== null uri.getQueryParameter("param3 [1]")== null
我试过没有括号部分传递参数的名称,它也不起作用.也调用getQueryParameters()不起作用.
谢谢你的帮助!
MH.*_*MH. 12
如文档中所述,Uri
构建和解析符合RFC 2396的 URI引用.
如果向下滚动到规范中的第2.4.3节,您将找到以下内容:
排除其他字符是因为
已知网关和其他传输代理有时会修改这些字符,或者它们被
用作分隔符.
unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "
"`必须转义与排除字符对应的数据,以便在URI中正确表示.
从代码的角度来看,Uri
有一个私有方法来确定是否允许一个字符 - 如果不允许,它将被编码.从理论上讲,这应该返回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);
}
Run Code Online (Sandbox Code Playgroud)
话虽这么说,现在我们到了有趣的部分.它似乎Uri.parse()
是"懒惰",因为它实际上并不编码你给它的uri.在您的场景中,您可能正在构建Uri
通过调用:
Uri uri = Uri.parse("http://host/path?param1=1¶m2[]=2¶m3[1]=3");
Run Code Online (Sandbox Code Playgroud)
然后,当您开始调用getQueryParameter()
结果时Uri
,后台数据(a String
)是"未编码",但是您提供给这些方法的参数名称会被编码.例如:
uri.getQueryParameter("param2[]")
Run Code Online (Sandbox Code Playgroud)
实际上是:
uri.getQueryParameter("param2%5B%5D")
Run Code Online (Sandbox Code Playgroud)
带键的查询参数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();
Run Code Online (Sandbox Code Playgroud)
这将导致以下基础uri:
http://host/path?param1=1¶m2%5B%5D=2¶m3%5B1%5D=3
Run Code Online (Sandbox Code Playgroud)
然后你可以uri.getQueryParameter("param3[1]")
毫无问题地打电话:它会返回3
.
编辑:我收回了我所说的Uri.parse()
懒惰.它的目的是这样.正如Javadoc中明确提到的那样:
创建一个解析给定编码 URI字符串的Uri .
换句话说:您提供的用于解析的字符串应该已经正确编码.
归档时间: |
|
查看次数: |
6084 次 |
最近记录: |