2009-07-28 29 views
40
  1. El usuario envía un formulario con algunos datos básicos.Enviar datos POST del controlador a otro sitio web en Rails

  2. Los datos se reciben y tratan mediante una acción en el controlador y se agrega más información que debe permanecer privada.

  3. Luego tengo que enviar una solicitud a un sitio web externo con todos los datos combinados del controlador.

¿Cuál es la mejor manera de hacerlo?

Respuesta

72

La forma más simple es el uso de la biblioteca central de rubí:

require "uri" 
require "net/http" 

params = {'box1' => 'Nothing is less important than which fork you use. Etiquette is the science of living. It embraces everything. It is ethics. It is honor. -Emily Post', 
'button1' => 'Submit' 
} 
x = Net::HTTP.post_form(URI.parse('http://www.interlacken.com/webdbdev/ch05/formpost.asp'), params) 
puts x.body 

Consejo profesional: Realice una solicitud asincrónica, utilizando una gema como delayed_job o background_rb

Ejemplo tomado de: http://biodegradablegeek.com/2008/04/how-to-post-form-data-using-ruby/

+2

Un ejemplo sobre el uso de delayyed_job en Ryan's railscast: http://railscasts.com/episodes/171-delayed-job –

+3

Esto fue lo primero que intenté. Lamentablemente, me da un error de 'fin de archivo alcanzado'. Al buscar, parece que otros han tenido problemas similares. Alguien tiene alguna idea? –

+0

Para resolver el error EOF al usar https, consulte http://stackoverflow.com/a/9227933/1161743 –

4

No creo que redirect_ maneje las solicitudes de publicación porque usa http 302 (?) Que simplemente OBTIENE la otra página.

Creo que se puede hacer algo como esto nota

Class MyController < ActionController 
    require 'net/http' 

    def my_method 
     #do something with the data/model 

     my_connection = Net::HTTP.new('www.target.com', 80) 
     reponse = my_connection.post(path_within_url, data) 

     #do something with response if you want 
    end 

end 

: este es el aire codificada y no se ha realizado ensayos o pruebas

29

Lo siento, olvidé mencionar que me estaba conectando al servidor seguro. Esta parece haber sido la razón por la que recibí errores al final del archivo. Agregar el uso de 'net/https' y llamar a use_ssl en la conexión resolvió el problema. Gracias por la ayuda de todos.

require 'net/https' 
require 'open-uri' 

url = URI.parse('https://MY_URL') 
req = Net::HTTP::Post.new(url.path) 
req.form_data = data 
req.basic_auth url.user, url.password if url.user 
con = Net::HTTP.new(url.host, url.port) 
con.use_ssl = true 
con.start {|http| http.request(req)}  

Esto se basa apagado de la fuente para el método post_form, así que supongo que voy a dar vlad.zloteanu la respuesta.

+0

:) bueno ... 10qu, me alegra que te haya ayudado. –

+1

Parece que funciona muy bien, sin embargo, esperaba que el controlador siguiera la redirección a la publicación también, pero parece que no es así. ¿Alguna idea de cómo podría hacer eso? – Alex

+1

Algo que acabo de resolver ... estableciendo la última línea para responder 'res = con.start {| http | http.request (req)} 'es útil. – Isaac

12

Si el servidor externo es RESTful, simplemente cree un modelo ActiveResource para manejar sus datos.

Cuestiones relacionadas