当我使用ruby 1.8.7 Net :: HTTP.post_form(URI.parse(URL),params)时,我发现它有一个错误,请参阅:
https://stackoverflow.com/questions/3214502/how-to-send-an-array-with-nethttp-post-form
我的代码是一个常规的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] })
但似乎没有调用我的set_form_data
方法(我已经调试过)。我的代码有什么问题吗?
答案 0 :(得分:5)
你对“别名”的运作方式有点怪癖。在net / http.rb中,我们找到:
def set_form_data(params, sep = '&')
...
end
alias form_data= set_form_data
调用者使用别名来调用此方法:
req.form_data = params
重新定义方法时,别名仍然停留在原始定义中,因此永远不会调用重新定义的方法。为了解决这个问题,您可以在重新定义方法后重新执行别名:
module Net
module HTTPHeader
def set_form_data(params, sep = '&')
..
end
alias form_data= set_form_data
end
end