小编典典

Java URI类:构造函数确定是否对查询进行编码?

java

这种行为是故意的吗?

//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的查询部分。我以为查询部分应该被编码?为什么其他构造函数不解码查询部分?


阅读 285

收藏
2020-11-26

共1个答案

小编典典

URI
JavaDoc中

单参数构造函数要求将其参数中的所有非法字符都用引号引起来,并保留所有转义的八位位组和其他存在的字符。

多参数构造函数根据出现它们的组件的需要引用非法字符。这些构造函数始终引用百分号(’%’)。任何其他字符都将保留。

因此,URI(String)期望您对所有内容进行正确编码,并假定%2F将被解码为的编码八进制数/

其他构造函数将对%字符进行结尾编码(导致%252F输入%2F),因此在解码后仍会得到%2F

我假设建设者之间的偏差的目的是为了让喜欢的事物new URI(otherUri.toString())toString()返回一个完全编码URI。

2020-11-26