【发布时间】:2010-11-26 02:31:19
【问题描述】:
我正在使用WWW::Mechanize 进行一些标准的网站遍历,但有一次我必须构造一个特殊的 POST 请求并将其发送出去。所有这些都需要会话 cookie。
在我发出的 POST 请求中,空格被编码为 + 符号,但我需要将它们编码为 %20。
我不知道如何改变这种行为。我意识到它们是等价的,但出于我无法控制的原因,这是我必须做的。
感谢您的帮助。
【问题讨论】:
我正在使用WWW::Mechanize 进行一些标准的网站遍历,但有一次我必须构造一个特殊的 POST 请求并将其发送出去。所有这些都需要会话 cookie。
在我发出的 POST 请求中,空格被编码为 + 符号,但我需要将它们编码为 %20。
我不知道如何改变这种行为。我意识到它们是等价的,但出于我无法控制的原因,这是我必须做的。
感谢您的帮助。
【问题讨论】:
这是在URI::_query::query_form() 中硬编码的。它将空格转换为 +。
$val =~ s/ /+/g;
然后它使用连接对调用 URI::_query::query,其中唯一的 + 符号应该是编码的空格。最简单的做法可能是使用Hook::LexWrap 拦截对 URI::_query::query 的调用,在调用开始之前修改参数,以便将 + 变为 %20,然后从那里继续。
更烦人的是重新定义 URI::_query::query。没那么长,你只需要在子程序的开头添加一些代码来转换参数,然后再继续。
或者,您可以在另一侧修复损坏的解析器。 :)
我在Mastering Perl 中有几章是关于处理方法覆盖和动态子例程的。诀窍是在不更改原始来源的情况下这样做,这样就不会给其他人带来新的问题。
【讨论】:
这似乎是在 URI::_query::query_form() 中硬编码的。我会根据全局有条件地修改它,就像使用 $URI::DEFAULT_QUERY_FORM_DELIMITER 所做的那样,并将您的更改提交给 URI 维护者。
除此之外,也许您可以使用 LWP::UserAgent request_prepare 回调处理程序?
【讨论】: