繁体   English   中英

如何从Java和Ruby相同地转义保留的URL字符?

[英]How can I escape reserved URL characters identically from Java and Ruby?

我有两个客户端,一个用Java编写,另一个用Ruby编写,需要从字符串中转义保留的URL字符。 我的问题是我找不到在两个平台上都执行完全相同编码的库。 输出必须完全相同,以便稍后可以比较转义的字符串是否相等。

为什么要以转义格式比较URL字符串? 即使可以用不同的方式对URL进行转义,您也可以取消转义并比较生成的String值。 这两个平台的未转义值应该相同。

问题是,您不能保证生成的URL将会一致。 查询参数的顺序可以不同,这将中断所有将URL比较为字符串的尝试。

相反,您必须将URL细分为它们的组成部分。 很好地遵循了URI规范,我们可以做到这一点并检索各个部分并进行比较。

例如:

require 'uri'

URL1 = 'http://www.example.com?foo=1&bar=2'
URL2 = 'http://www.Example.com?bar=2&foo=1'

URL1 == URL2 # => false

url1 = URI.parse(URL1)
url2 = URI.parse(URL2)

(url1.host.downcase == url2.host.downcase) && (URI.decode_www_form(url1.query).sort == URI.decode_www_form(url2.query).sort)
# => true

尝试比较URL1URL2作为字符串,它将失败。 尝试将查询作为字符串进行比较,它将失败。 对主机进行不区分大小写的比较,并对查询组件进行排序,以便对它们进行归一化,从而可以合理地比较事物以查看它们是否匹配。

如果您知道接收该查询的主机不区分大小写,则可以将其缩短一点:

url1 = URI.parse(URL1.downcase)
url2 = URI.parse(URL2.downcase)

(url1.host == url2.host) && (URI.decode_www_form(url1.query).sort == URI.decode_www_form(url2.query).sort)
# => true

我遇到了一些主机,它们在查询中期望区分大小写的参数以及与位置相关的参数,因此对于特定的URL而言,将所有内容都转换为小写字母可能不起作用,但是对于测试是否相等,应该可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM