0

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

4

2 回答 2

0

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

于 2013-10-24T19:46:21.497 回答
0

问题是,您不能保证生成的 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,但对于测试相等性应该没问题。

于 2013-10-24T20:18:59.347 回答