Enviar datos de POST desde el controlador a otro sitio web en Rails


  1. El usuario envía un formulario con algunos datos básicos.

  2. Los datos son recibidos y tratados por una acción en el controlador y se agrega más información que necesita permanecer privada.

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

¿Cuál es la mejor manera de hacer esto?

Author: jaysoifer, 2009-07-28

4 answers

La forma más sencilla es usar la biblioteca ruby core:

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

Sugerencia pro: Haga una solicitud asincrónica, usando una gema como delayed_job o background_rb

 74
Author: Vlad Zloteanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 08:58:16

Lo siento, me olvidé de mencionar que me estaba conectando al servidor seguro. Esta parece haber sido la razón por la que estaba recibiendo final de errores de archivo. Agregar usando '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 en la fuente para el método post_form, así que supongo que daré vlad.zloteanu la respuesta.

 30
Author: Alex.Bullard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-29 19:13:03

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

 12
Author: askegg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-17 16:52:08

No creo que redirect_to maneje solicitudes post porque usa http 302 (?) que acaba de obtener la otra página.

Creo que puedes hacer algo como esto

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

Nota: esto está codificado por aire y no ha sido probado o probado

 4
Author: ErsatzRyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-28 19:06:21