cot*_*aws 13 java url encoding uri
我在编写URL到URI时遇到问题:
mUrl = "A string url that needs to be encoded for use in a new HttpGet()";
URL url = new URL(mUrl);
URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(),
url.getQuery(), null);
Run Code Online (Sandbox Code Playgroud)
这不符合我对以下URL的期望:
传入字符串:
http://m.bloomingdales.com/img?url=http%3A%2F%2Fimages.bloomingdales.com%2Fis%2Fimage%2FBLM%2Fproducts%2F3%2Foptimized%2F1140443_fpx.tif%3Fwid%3D52%26qlt%3D90% 2C0%26layer%3Dcomp%26op_sharpen%3D0%26resMode%3Dsharp2%26op_usm%3D0.7%2C1.0%2C0.5%2C0%26fmt%3Djpeg&TTL = 30D
出来是:
http://m.bloomingdales.com/img?url=http%253A%252F%252Fimages.bloomingdales.com%252Fis%252Fimage%252FBLM%252Fproducts%252F3%252Foptimized%252F1140443_fpx.tif%253Fwid%253D52%2526qlt%253D90% 252C0%2526layer%253Dcomp%2526op_sharpen%253D0%2526resMode%253Dsharp2%2526op_usm%253D0.7%252C1.0%252C0.5%252C0%2526fmt%253Djpeg&TTL = 30D
哪个坏了.例如,%3D变成了%253D它似乎对字符串中的%已经做了一些神秘的事情.
发生了什么事,我在这里做错了什么?
mgi*_*uca 29
您首先将(已经转义的)字符串放入URL类中.这并没有逃脱任何事情.然后你拉出了部分URL,它们返回它们而不需要任何进一步的处理(所以 - 它们仍然被转义,因为当你把它们放入时它们被转义).最后,您将URI使用多参数构造函数将节放入类中.此构造函数被指定为使用百分比对URI组件进行编码.
因此,在最后一步中,例如," :"变为" %3A"(好)," %3A"变为" %253A"(差).由于您要放入已编码*的URL,因此您不希望再次对它们进行编码.
因此,单参数的构造函数的URI是你的朋友.它不会逃避任何事情,并要求您传递预转义字符串.因此,您根本不需要URL:
mUrl = "A string url is already percent-encoded for use in a new HttpGet()";
URI uri = new URI(mUrl);
Run Code Online (Sandbox Code Playgroud)
*唯一的问题是,如果您的网址有时不是百分比编码,有时它们是.然后你有一个更大的问题.您需要确定您的程序是从一个始终编码的URL开始,还是需要编码的URL.
请注意,有没有这样的事情作为一个完整的URL这是不是百分比编码.例如,您无法获取完整的URL" http://example.com/bob&co",并以某种方式将其转换为正确编码的URL" http://example.com/bob%26co" - 您如何区分语法(不应该被转义)和字符(应该是)?这就是单参数形式URI要求字符串已经转义的原因.如果你有非转义字符串,你需要在将它们插入完整的URL语法之前对它们进行百分比编码,这就是URI帮助你做的多参数构造函数.
编辑:我错过了原始代码丢弃片段的事实.如果你想删除URL的片段(或任何其他部分),你可以构造URI如上所述,然后根据需要拉出所有部分(它们将被解码为常规字符串),然后将它们传递回URI多个参数构造函数(它们将被重新编码为URI组件):
uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
uri.getPath(), uri.getQuery(), null) // Remove fragment
Run Code Online (Sandbox Code Playgroud)