Submit POST data from controller to another website in Rails
Solution 1
The simpliest way is using ruby core library:
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 Tip: Do an asynchronous request, using a gem like delayed_job or background_rb
Solution 2
Sorry, I neglected to mention that I was connecting to secure server. This seems to have been the reason that I was getting end of file errors. Adding using 'net/https' and calling use_ssl on connection solved the problem. Thanks for everyones help.
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)}
This is based off the source for the post_form method, so i guess I'll give vlad.zloteanu the answer.
Solution 3
If the external server is RESTful, then simply create an ActiveResource model to handle your data.
Solution 4
I don't think redirect_to handles post requests because it uses http 302 (?) which just GETs the other page.
I believe you can do something like this
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
note: this is air coded and has not been tried or tested
Alex.Bullard
Updated on July 09, 2022Comments
-
Alex.Bullard almost 2 years
User submits a form with some basic data.
The data is received and treated by an action in the controller and more information that needs to remain private is added.
Then I need to send a post request to an external website with all of the combined data from the controller.
What is the best way to do this?
-
Alex.Bullard almost 15 yearsThis was the first thing I attempted. Unfortunately it gives me an 'end of file reached' error. From searching around it seems that others have had similar problems. Anyone have any insights?
-
Vlad Zloteanu almost 15 years:) well.. 10qu, i'm glad it helped you.
-
Alex over 12 yearsThis seems to be working great, however I was expecting the controller to follow the redirection to the post as well, but it does not seems to be the case? Any any idea how I could do that?
-
Jonathan Lin over 11 yearsTo solve EOF error when using https, see stackoverflow.com/a/9227933/1161743
-
Isaac over 9 yearsSomething I just worked out... setting the last line to response
res = con.start {|http| http.request(req)}
is useful. -
dowi about 8 years@VladZloteanu - why is your advice "do an asyncronius request, using a gem like delayed_job" ? thanks