如何使用Rails中的curl编码params?

时间:2009-06-16 21:50:11

标签: html ruby-on-rails forms encoding curl

我正在使用Pommo作为我的邮件列表,不幸的是Pommo没有提供HTTP API,但我提供并可以在我的网站上嵌入订阅表单。但是使用该表单发布会让我离开我的网站,这对我来说是不可接受的。

所以我想在Rails中进行字段验证,然后使用curl发布值。

Pommo生成的字段如下所示:

   <input type="text" size="32" maxlength="60" name="Email" id="email" value="" />
   <input type="text" size="32" name="d[1]" id="field1" />
   <input type="text" size="32" name="d[2]" id="field2" />
   <input type="text" size="32" name="d[3]" id="field3" value="México" />

在Rails中生成以下参数:

   { "d"=>{"1"=>"Macario", "2"=>"Ortega", "3"=>"México", "5"=>""}, "Email" => mail@example.com ... }

现在我可以验证电子邮件的格式以及是否存在必填字段但我不知道如何将此哈希编码为使用curl发布的字符串。

这种数据结构编码是标准的还是依赖于应用程序? 它有名字吗?

5 个答案:

答案 0 :(得分:9)

ActiveSupport(在Rails下免费提供)提供了一个方便的to_param方法。

{
  "d" => {
    "1" => "Macario",
    "2" => "Ortega",
    "3" => "Mxico",
    "5" => ""
  },
  "Email" => "mail@example.com"
}.to_param
# => "Email=mail%40example.com&d%5B1%5D=Macario&d%5B2%5D=Ortega&d%5B3%5D=Mxico&d%5B5%5D="

答案 1 :(得分:2)

该格式由Rails创建,函数为normalize_params。基本上它递归地将[]解释为哈希。您可以在Rails API page找到代码。

这是一个非常粗略的示例函数,可以根据您的情况撤消它:

def create_post_params(params, base = "")
  toreturn = ''
  params.each_key do |key|
    keystring = base.blank? ? key : "#{base}[#{key}]"
    toreturn << (params[key].class == Hash ? create_post_params(params[key], keystring) : "#{keystring}=#{CGI.escape(params[key])}&")
  end
  toreturn
end

我还没有真正测试过它,但它确实是你想要的。然后你可以使用卷曲之类的东西。但您也可以使用内置的Ruby Net :: HTTP库 类似的东西:

@server = URI.parse(server_url)
http = Net::HTTP.new(@server.host, @server.port)
http.use_ssl = @server.is_a?(URI::HTTPS)
result = http.post(@server.path + "PATH TO METHOD IN SERVER", create_post_params(params), SOME_HEADER_OPTIONS)

我还建议您查看名为HTTParty的项目。它是一个为服务提供简单HTTP API类的库。

答案 2 :(得分:0)

您应该能够从rails应用程序中发布HTTP帖子

http = Net :: HTTP.new('localhost','3030')    result = http.post('/ process_email_form',form_param_hash)。

您可以通过查看Pommo表单生成的HTTP标头和参数信息来验证此方法,以反对您的内部应用程序帖子

答案 3 :(得分:0)

这将被称为“序列化”Serialization,在这种情况下,它很可能依赖于Rails(我来自PHP背景)。

答案 4 :(得分:0)

如果你正在寻找一个手工完成的功能,我只是写了这个

 def encode_parameters(params, base = [])
   params.delete_if { |k,v| [ :method, :action, :controller ].include?(k.to_s.intern) }.map do |k,v|
     if v.is_a?(Hash) 
       encode_parameters(v, base.clone.push(k))
     else
       base.length == 0 ? "#{CGI::escape(k.to_s)}=#{CGI::escape(v.to_s)}" : "#{CGI::escape(base[0].to_s)}#{base.slice(1, base.length).map { |b| CGI::escape("[#{b.to_s}]")}.join("") }#{CGI::escape("[#{k.to_s}]")}=#{CGI::escape(v.to_s)}"
     end
   end.join("&")
 end

享受!