Отправьте данные POST с контроллера на другой веб-сайт в Rails

  1. Пользователь отправляет форму с некоторыми основными данными.

  2. Данные принимаются и обрабатываются действием в контроллере, и добавляется дополнительная информация, которая должна оставаться закрытой.

  3. Затем мне нужно отправить почтовый запрос на внешний веб-сайт со всеми объединенными данными с контроллера.

Как лучше всего это сделать?


person Alex.Bullard    schedule 28.07.2009    source источник


Ответы (5)


Самый простой способ - использовать основную библиотеку ruby:

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

Совет для профессионалов: сделайте асинхронный запрос, используя гем, такой как delayed_job или background_rb

person Vlad Zloteanu    schedule 28.07.2009

Извините, я забыл упомянуть, что подключался к защищенному серверу. Кажется, это было причиной того, что я получал ошибки конца файла. Добавление использования «net/https» и вызов use_ssl при подключении решили проблему. Спасибо всем за помощь.

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

Это основано на исходном коде метода post_form, поэтому, думаю, я дам ответ vlad.zloteanu.

person Alex.Bullard    schedule 29.07.2009
comment
:) хорошо.. 10qu, я рад, что это помогло вам. - person Vlad Zloteanu; 30.07.2009
comment
Кажется, это отлично работает, однако я ожидал, что контроллер также будет следовать перенаправлению на сообщение, но, похоже, это не так? Любая идея, как я мог это сделать? - person Alex; 26.09.2011
comment
Кое-что, что я только что разработал... установка последней строки на ответ res = con.start {|http| http.request(req)} полезна. - person Isaac; 11.03.2015

Если внешний сервер RESTful, просто создайте модель ActiveResource. для обработки ваших данных.

person askegg    schedule 30.07.2009

Я не думаю, что redirect_to обрабатывает почтовые запросы, потому что он использует http 302 (?), Который просто ПОЛУЧАЕТ другую страницу.

Я верю, что вы можете сделать что-то вроде этого

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

примечание: это воздушное кодирование и не было опробовано или проверено

person ErsatzRyan    schedule 28.07.2009

Если вы хотите отправить JSON, все, что вам нужно, это что-то вроде следующего (проверено в Rails 6):

Net::HTTP.post(
  URI('https://example.com/some/path'),
  { "this is the": "request body" }.to_json,
  'Content-Type' => 'application/json'
)
person soundly_typed    schedule 03.06.2020