Hon*_*nte 6 java encoding uri percent-encoding
System.out.println(
new URI("http", "example.com", "/servlet", "a=x%20y", null));
Run Code Online (Sandbox Code Playgroud)
结果是http://example.com/servlet?a=x%2520y,查询参数值与提供的值不同.奇怪,但这确实遵循Javadoc:
"百分比字符('%')总是由这些构造函数引用."
我们可以传递解码后的字符串,a=x y然后得到一个合理的(?)结果a=x%20y.
但是如果查询参数值包含"&"字符呢?例如,如果值是具有查询参数的URL本身,则会发生这种情况.看看这个(错误的)查询字符串:
a=b&c.必须在此处转义&符号(a=b%26c),否则这可以被视为查询参数a=b和一些垃圾(c).如果我将它传递给URI构造函数,它会对其进行编码,并返回错误的URL:...?a=b%2526c
这个问题似乎使java.util.URI无用.我在这里错过了什么吗?
java.net.URI确实知道URI的查询部分的存在,但它不了解查询部分的内部,这可能因每个方案而不同.例如,java.net.URI不了解HTTP查询部分的内部结构.如果java.net.URI将查询视为不透明字符串,并且未对其进行更改,则这不会成为问题.但它试图应用一些通用的百分比编码算法,它打破了HTTP URL.
因此,我不能使用URI类从其部分可靠地组装URL,尽管它有构造函数.我还要提到的是,从Java 7开始,相对化操作的实现非常有限,只有当一个URL是另一个URL的前缀时才有效.这两个功能(以及用于这些目的的更精简的界面)是我对java.net.URI感兴趣的原因,但它们都不适合我.
最后,我使用java.net.URL进行解析,并编写代码来汇编部件中的URL并重新激活两个URL.我还检查了Apache HttpClient URIBuilder类,虽然它确实理解了HTTP查询字符串的内部结构,但是从4.3开始,它在处理整个查询部分时遇到了像java.net.URI这样的编码问题.
查询字符串
a=b&c
Run Code Online (Sandbox Code Playgroud)
URI 中没有错误。关于 URI 通用语法的RFC指出
查询组件是由资源解释的一串信息。
Run Code Online (Sandbox Code Playgroud)query = *uric在查询组件中,字符“;”、“/”、“?”、“:”、“@”、“
&”、“=”、“+”、“,”和“$”被保留。
查询字符串中的字符&非常有效(uric代表保留字符、标记字符和字母数字字符)。RFC 还指出
许多 URI 包含由某些特殊字符组成或分隔的组件。这些字符被称为“保留”,因为
它们在 URI 组件中的使用仅限于其保留
目的。 如果 URI 组件的数据与保留的目的相冲突,则必须在 形成 URI
之前转义冲突的数据。
由于&是有效但保留的,因此由用户决定是否对其进行编码。
您所说的查询参数不是 URI 的功能,因此该类URI没有理由(也不应该)支持它。
有关的: