【问题标题】:Can can I encode spaces as %20 in a POST from WWW::Mechanize?我可以在 WWW::Mechanize 的 POST 中将空格编码为 %20 吗?
【发布时间】:2010-11-26 02:31:19
【问题描述】:

我正在使用WWW::Mechanize 进行一些标准的网站遍历,但有一次我必须构造一个特殊的 POST 请求并将其发送出去。所有这些都需要会话 cookie。

在我发出的 POST 请求中,空格被编码为 + 符号,但我需要将它们编码为 %20。

我不知道如何改变这种行为。我意识到它们是等价的,但出于我无法控制的原因,这是我必须做的。

感谢您的帮助。

【问题讨论】:

    标签: perl http mechanize lwp


    【解决方案1】:

    这是在URI::_query::query_form() 中硬编码的。它将空格转换为 +。

     $val =~ s/ /+/g;
    

    然后它使用连接对调用 URI::_query::query,其中唯一的 + 符号应该是编码的空格。最简单的做法可能是使用Hook::LexWrap 拦截对 URI::_query::query 的调用,在调用开始之前修改参数,以便将 + 变为 %20,然后从那里继续。

    更烦人的是重新定义 URI::_query::query。没那么长,你只需要在子程序的开头添加一些代码来转换参数,然后再继续。

    或者,您可以在另一侧修复损坏的解析器。 :)

    我在Mastering Perl 中有几章是关于处理方法覆盖和动态子例程的。诀窍是在不更改原始来源的情况下这样做,这样就不会给其他人带来新的问题。

    【讨论】:

    • 最好以其他人可以使用的方式修复它,并且如果有人执行将 URI 转换为 XS 之类的操作,则不会被静默破坏。
    【解决方案2】:

    这似乎是在 URI::_query::query_form() 中硬编码的。我会根据全局有条件地修改它,就像使用 $URI::DEFAULT_QUERY_FORM_DELIMITER 所做的那样,并将您的更改提交给 URI 维护者。

    除此之外,也许您可​​以使用 LWP::UserAgent request_prepare 回调处理程序?

    【讨论】:

    • 为什么你认为 $URI::DEFAULT_QUERY_FORM_DELIMITER 与它有什么关系?这就是对之间发生的事情。这是 query_form 硬编码 s/ //+/g 的问题;
    • @brian d foy:我不知道。我建议做一个类似的 hack 来覆盖 URI 的空间编码。
    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多