如何在不考虑查询参数顺序的情况下测试 URI 相等性

How can I test URI equality without respecting query parameter ordering

我想要类似 URI::eq 的东西,除了这样比较的 URI 的规范形式忽略查询参数排序,

print URI::eq(
  q[http://a.a/?a=1&z=2], # a before z
  q[http://a.a/?z=2&a=1]  # z before a
);

我想要这个return是的。

我建议将查询参数键作为列表获取(例如使用 URI::QueryParam ),对其进行排序并进行比较(可以使用 Data::Compare )。

如果它们相同,您必须比较每个键的值。

请记住,这不一定是微不足道的,值可以是 JSON, 你必须先解码或确保它是规范的, 所以直接 'eq' 可能会导致漏报。

解码 JSON 后,您将得到一个相当随意的数据结构(至少是可序列化的)。现在 eq 可能足以满足您的目的,也可能不够好,这再次取决于您的需要(空字符串是否与无值相同?0 与 0.0 相同吗?等等)。

您的示例似乎表明您没有考虑过这一点,因此您可能不需要它,这将使这变得非常简单:只需 'eq'- 比较所有值。或者您低估了问题,在这种情况下,您可能想问另一个问题或 post 其他信息。

就我个人而言,我不知道执行此操作的模块,但我很高兴得知有一个模块!

您可以规范化查询。

use List::Util qw( pairs );

$uri->query_form([
   map { $_->[0], $_->[1] }
      sort { $a->[0] cmp $b->[0] || $a->[1] cmp $b->[1] }
         pairs
            $uri->query_form
]);