wake-up-neo.com

Senden Sie POST Daten vom Controller an eine andere Website in Rails

  1. Der Benutzer sendet ein Formular mit einigen grundlegenden Daten.

  2. Die Daten werden von einer Aktion im Controller empfangen und verarbeitet, und weitere Informationen, die privat bleiben müssen, werden hinzugefügt.

  3. Dann muss ich eine Post-Anfrage an eine externe Website mit allen kombinierten Daten vom Controller senden.

Wie geht das am besten?

48
Alex.Bullard

Der einfachste Weg ist die Verwendung der Ruby Kernbibliothek:

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

Pro-Tipp: Führen Sie eine asynchrone Anfrage mit einem Edelstein wie delayed_job oder background rb aus

82
Vlad Zloteanu

Entschuldigung, ich habe versäumt zu erwähnen, dass ich eine Verbindung zum sicheren Server hergestellt habe. Dies scheint der Grund dafür gewesen zu sein, dass ich Dateifehler am Ende hatte. Das Hinzufügen von 'net/https' und das Aufrufen von use_ssl bei der Verbindung löste das Problem. Vielen Dank für jedermanns Hilfe.

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

Dies basiert auf der Quelle für die post_form-Methode, daher gebe ich vermutlich vlad.zloteanu die Antwort.

33
Alex.Bullard

Wenn der externe Server REST-fähig ist, erstellen Sie einfach ein ActiveResource -Modell, um Ihre Daten zu verarbeiten.

12
askegg

Ich glaube nicht, dass redirect_to Post-Anfragen behandelt, da es http 302 (?) Verwendet, das nur die andere Seite abruft.

Ich glaube, Sie können so etwas tun

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

hinweis: Dies ist luftkodiert und wurde nicht getestet oder getestet

4
ErsatzRyan