将控制器中的POST数据提交到Rails中的另一个网站

Ale*_*ard 48 ruby forms ruby-on-rails request form-submit

  1. 用户提交包含一些基本数据的表单.

  2. 数据由控制器中的动作接收和处理,并且添加了需要保持私有的更多信息.

  3. 然后我需要向外部网站发送一个发布请求,其中包含来自控制器的所有组合数据.

做这个的最好方式是什么?

Vla*_*anu 83

最简单的方法是使用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
Run Code Online (Sandbox Code Playgroud)

专业提示:使用像delayed_job或background_rb 这样的gem执行异步请求

  • 这是我尝试的第一件事.不幸的是,它给了我一个'文件结束'错误.从搜索周围看来,其他人也有类似的问题.有人有任何见解吗? (3认同)
  • 关于在Ryan的railscast上使用delayed_job的一个例子:http://railscasts.com/episodes/171-delayed-job (2认同)

Ale*_*ard 33

对不起,我忽略了提到我正在连接到安全服务器.这似乎是我收到文件错误的原因.使用'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)}    
Run Code Online (Sandbox Code Playgroud)

这是基于post_form方法的来源,所以我想我会给vlad.zloteanu答案.

  • 这似乎工作得很好,但我期待控制器也跟着重定向到帖子,但似乎并非如此?任何想法我怎么能这样做? (2认同)

ask*_*egg 12

如果外部服务器是RESTful,那么只需创建一个ActiveResource模型来处理您的数据.


Ers*_*yan 5

我不认为redirect_to处理post请求,因为它使用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
Run Code Online (Sandbox Code Playgroud)

注意:这是空中编码,尚未经过尝试或测试