Invia i dati POST dal controller a un altro sito Web in Rails

  1. L’utente invia un modulo con alcuni dati di base.

  2. I dati vengono ricevuti e trattati da un’azione nel controller e vengono aggiunte ulteriori informazioni che devono rimanere private.

  3. Quindi ho bisogno di inviare una richiesta di posta a un sito Web esterno con tutti i dati combinati dal controller.

Qual è il modo migliore per farlo?

Il modo più semplice è usare la libreria di 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 

Suggerimento: fai una richiesta asincrona, usando una gem come delayed_job o background_rb

Scusa, ho dimenticato di menzionare che mi stavo connettendo al server sicuro. Questo sembra essere stato il motivo per cui stavo arrivando alla fine degli errori di file. L’aggiunta di ‘net / https’ e l’uso di use_ssl sulla connessione ha risolto il problema. Grazie per l’aiuto di tutti.

 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)} 

Questo è basato sulla fonte del metodo post_form, quindi suppongo che darò a vlad.zloteanu la risposta.

Se il server esterno è RESTful, è sufficiente creare un modello ActiveResource per gestire i dati.

Non penso che redirect_per gestire le richieste di posta perché usa http 302 (?) Che ottiene semplicemente l’altra pagina.

Credo che tu possa fare qualcosa del genere

 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: questo è codificato per aria e non è stato provato o testato