这种行为是故意的吗?
//create the same URI using two different constructors URI foo = null, bar = null; try { //constructor: URI(uri string) foo = new URI("http://localhost/index.php?token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB"); } catch (URISyntaxException e) {} try { //constructor: URI(scheme, authority, path, query, fragment) bar = new URI("http", "localhost", "/index.php", "token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB", null); } catch (URISyntaxException e) {} //the output: //foo.getQuery() = token=4/4EzdsSBg_4vX6D5pzvdsMLDoyItB //bar.getQuery() = token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB
URI(字符串uri)构造函数似乎正在解码URI的查询部分。我以为查询部分应该被编码?为什么其他构造函数不解码查询部分?
从URI JavaDoc中:
单参数构造函数要求将其参数中的所有非法字符都用引号引起来,并保留所有转义的八位位组和其他存在的字符。 多参数构造函数根据出现它们的组件的需要引用非法字符。这些构造函数始终引用百分号(’%’)。任何其他字符都将保留。
单参数构造函数要求将其参数中的所有非法字符都用引号引起来,并保留所有转义的八位位组和其他存在的字符。
多参数构造函数根据出现它们的组件的需要引用非法字符。这些构造函数始终引用百分号(’%’)。任何其他字符都将保留。
因此,URI(String)期望您对所有内容进行正确编码,并假定%2F将被解码为的编码八进制数/。
%2F
/
其他构造函数将对%字符进行结尾编码(导致%252F输入%2F),因此在解码后仍会得到%2F。
%
%252F
我假设建设者之间的偏差的目的是为了让喜欢的事物new URI(otherUri.toString())与toString()返回一个完全编码URI。
new URI(otherUri.toString())
toString()