gpt4 book ai didi

java - URL 到 URI 编码将 "%3D"更改为 "%253D"

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:05 25 4
gpt4 key购买 nike

我在将 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);

这不符合我对以下 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 它似乎对字符串中已有的 % 做了一些神秘的事情。

这是怎么回事,我做错了什么?

最佳答案

您首先将(已经转义的)字符串放入 URL 类中。那没有逃避任何事情。然后你将提取 URL 的部分,这将返回它们而不进行任何进一步处理(因此 - 它们仍然被转义,因为当你将它们放入时它们被转义了)。最后,您使用 multi-argument constructor 将这些部分放入 URI 类中.此构造函数指定为使用百分比对 URI 组件进行编码。

因此,正是在这最后一步,例如,“:”变成了“%3A”(好)和“%3A”变成“%253A”(错误)。由于您输入的是已经编码*的 URL,因此您不想再次对它们进行编码。

因此,single-argument constructor URI 是你的 friend 。它不会转义任何内容,并且需要您传递预转义的字符串。因此,您根本不需要 URL:

mUrl = "A string url is already percent-encoded for use in a new HttpGet()";
URI uri = new URI(mUrl);

*唯一的问题是您的 URL 有时不是百分比编码,有时是。那么你有一个更大的问题。您需要决定您的程序是从一个始终编码的 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

关于java - URL 到 URI 编码将 "%3D"更改为 "%253D",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com