System.out.println(
new URI("http", "example.com", "/servlet", "a=x%20y", null));
结果为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
在URI中没有错。关于URI通用语法状态的RFC
查询组件是由资源解释的信息字符串。
query = *uric
在查询组件中,
保留了字符“;”,“ /”,“?”,“:”,“ @”,“&”,“ =“,“ +”,“,”和“ $”。
字符&
在查询字符串是非常有效的(uric
表示预留的,标记,字母数字字符)。RFC还指出
许多URI包含由某些
特殊字符组成或由其分隔的组件。这些字符被称为“保留”,因为
它们在URI组件中的使用仅限于其保留
目的。如果URI组件的数据将与
保留用途冲突,则必须在
形成URI之前转义冲突的数据。
由于验证码&
有效但已保留,因此由用户决定是否要对其进行编码。
您所谓的查询参数不是URI的功能,因此URI
该类没有理由(也不应该)支持它。
有关:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句