Как мне кодировать параметры для публикации с помощью curl из Rails? - PullRequest
1 голос
/ 17 июня 2009

Я использую 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 ]

9 голосов
/ 17 июня 2009

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="
2 голосов
/ 17 июня 2009

Этот формат создается Rails с функцией normalize_params. В основном это рекурсивно интерпретирует [] как хэши. Код можно найти на странице Rails API .

Вот очень грубая функция выборки, чтобы отменить ее для вашего случая:

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 для сервисов.

0 голосов
/ 23 июля 2011

Если вы ищете функцию, которая делает это вручную, я просто написал это

 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

Наслаждайтесь!

0 голосов
/ 17 июня 2009

Это будет называться «сериализация» Сериализация , и в этом случае, скорее всего, это зависит от Rails (я из PHP-фона).

0 голосов
/ 17 июня 2009

вы должны иметь возможность сделать HTTP-пост из вашего приложения rails

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

Вы можете проверить этот подход, просмотрев заголовок HTTP и информацию о параметрах, сгенерированную из формы Pommo, относительно того, что вы публикуете во внутреннем приложении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...