Publicidad:
La Coctelera

Sugerencia de presentación

He nacido para vago

8 Octubre 2007

Enviando formularios con parámetros compuestos con Ruby y net/http

Un truquito rápido.

Cuando desde un script Ruby queremos enviar un formulario por POST solemos usar la librería net/http y un método de alto nivel llamado post_form:

 require 'net/http'
 require 'uri'
 HTTP.post_form URI.parse('http://www.example.com/search.cgi'),
          { "q" => "ruby", "max" => "50" }
 

Sin embargo, cuando queremos hacer un envío más complejo, con parámetros compuestos (al estilo de los formularios generados por los helpers de Rails), ese método ya no vale, porque sólo soporta como parámetro un hash en el que claves y valores sean cadenas, y no otros hashes. Así que hemos de usar el método de más bajo nivel post, y encadenar los parámetros a mano, lo cual es un poco rollo.

Con esta pequeña (y fea ) extensión de la clase Hash es un poco más simple:

 module HashToHttpParams
   def to_http_params
     map do |k, v|
       if v.is_a?(Hash)
         v.map do |kk, vv|
           "#{k}[#{kk}]=#{vv}"
         end.join('&')
       else
         "#{k}=#{v}"
       end
     end.join('&')
   end
 end
 Hash.send(:include, HashToHttpParams)
 

Así que aunque tengamos que usar la forma "de bajo nivel", pues no es más complicado:

 my_params = {
  :post => {
    :body => "Bla!",
    :title => "Bla, bla, bla",
  },
  :tag => {
    :name => "bla"
  },
  :publish => "Publicar"
 }
 Net::HTTP.start("www.example.com") do |http|
   http.post("/posts/create", my_params.to_http_params)
 end
 

Y en otro momento cuento un truquete igual de quick & dirty para hacer esto mismo con autenticación, cuando el site no tiene el buen gusto de usar la autenticación HTTP (es decir, casi nunca ), y usa un sistema basado en cookies y sesiones.

servido por porras 4 comentarios compártelo

4 comentarios · Escribe aquí tu comentario

lamazmorradelandroide

lamazmorradelandroide dijo

Vale, lo he entendido todo, pero qué es un formulario? xD

Fuerza y honor.

9 Octubre 2007 | 10:51 PM

porras

porras dijo

=xDDDDDD nick, cabrón, me jodes todos los posts técnicos con una gracia que me resulta imposible cabrearme...

9 Octubre 2007 | 10:54 PM

lamazmorradelandroide

lamazmorradelandroide dijo

Puedes cabrearte!!! Te dejo, pero no más de una vez al mes. Lo siento, no tengo una receta para dártelo por escrito... Te lo pongo en un "formulario"?

xD

Fuerza y honor.

12 Octubre 2007 | 09:42 PM

Franco

Franco dijo

Gracias por el post, me has ahorrado una laptop porque te juro que la estaba por tirar contra la pared jeje.

te dejo aquí mi solución final con autenticación

parameters = { :page => {"page_text"=>"test", "page_title"=>"test", "browser_title"=>"test"} }

url = URI.parse('http://localhost:3000/admin/pages/create')

req = Net::HTTP::Post.new(url.path)
req.basic_auth @username, @password

res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req, parameters.to_http_params) }

Saludos.

29 Junio 2009 | 11:05 PM

Escribe tu comentario


Sobre mí

Avatar de porras

Sugerencia de presentación

ver perfil »
contacto »

Me llamo Sergio Gil Pérez de la Manga, y mi madre se cabrea si escribo mi nombre con un sólo apellido. Vivo, trabajo y hago casi todo lo demás en Madrid.

Trabajo como programador porque es lo más parecido que he encontrado a no trabajar. Sobre todo si lo haces bien. Y en eso estoy, en hacerlo cada vez mejor para trabajar cada vez menos. Alguno lo llamaría vagancia, y yo ahí no me meto.

Algunas de las herramientas que en este momento me llevan al Nirvana de no dar un palo al agua son Ruby, Ruby on Rails, Textmate, cualquier sabor de Unix (en este momento principalmente MacOSX pero también Ubuntu Linux) y sus herramientas, o Rake. En ocasiones hablo de ellas aquí, pienso que a alguien le pueden servir y que no puedo ser el único al que no le gusta trabajar.

Y como no sólo de tecnología vive el hombre (bueno, el hombre no sé, pero desde luego yo no), por aquí aparece de vez en cuando la punta del iceberg de mis pequeños pensamientos; al menos la parte de ellos que no cabe en Twitter.

Bienvenidos todos.

Y ahora: ¿Y tú?

Fotos

porras todavía no ha subido ninguna foto.

¡Anímale a hacerlo!

Buscar

suscríbete

Selecciona el agregador que utilices para suscribirte a este blog (también puedes obtener la URL de los feeds):

¿Qué es esto?

Crea tu blog gratis en La Coctelera