当我使用ruby 1.8.7 Net :: HTTP.post_form(URI.parse(URL),params)时,我发现它有一个bug,请参阅:
我的代码是一个常规的ruby脚本,我想覆盖那个方法(net/http.rb#set_form_data),如下所示:
require 'net/http'
require 'uri'
module Net
module HTTPHeader
def set_form_data(params, sep = '&')
params_array = params.map do |k,v|
v.inject([]){|c, val| c << "#{urlencode(k.to_s)}=#{urlencode(val.to_s)}"}.join(sep)
end
self.body = params_array.join(sep)
self.content_type = 'application/x-www-form-urlencoded'
end
end
end
res = Net::HTTP.post_form(URI.parse(URL),
{'type'=>'flowers',
'colors[]' => %w[red white blue] })
Run Code Online (Sandbox Code Playgroud)
但似乎我的set_form_data方法没有被调用(我发布了).我的代码有什么问题吗?
你对"别名"的工作方式有点怪癖.在net/http.rb中,我们发现:
def set_form_data(params, sep = '&')
...
end
alias form_data= set_form_data
Run Code Online (Sandbox Code Playgroud)
调用者使用别名来调用此方法:
req.form_data = params
Run Code Online (Sandbox Code Playgroud)
重新定义方法时,别名仍然停留在原始定义中,因此永远不会调用重新定义的方法.要解决此问题,您可以在重新定义方法后重新执行别名:
module Net
module HTTPHeader
def set_form_data(params, sep = '&')
..
end
alias form_data= set_form_data
end
end
Run Code Online (Sandbox Code Playgroud)