2009-07-28 49 views
40
  1. Người dùng gửi biểu mẫu có một số dữ liệu cơ bản.Gửi dữ liệu POST từ bộ điều khiển đến một trang web khác trong Rails

  2. Dữ liệu được nhận và xử lý bởi một hành động trong bộ điều khiển và cần thêm thông tin cần giữ riêng tư.

  3. Sau đó, tôi cần gửi yêu cầu đăng bài tới trang web bên ngoài với tất cả dữ liệu được kết hợp từ bộ điều khiển.

Cách tốt nhất để làm điều này là gì?

Trả lời

72

Cách đơn giản nhất là sử dụng thư viện ruby ​​lõi:

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 

Mẹo chuyên nghiệp: Thực hiện yêu cầu không đồng bộ, sử dụng đá quý như delayed_job hoặc background_rb

Ví dụ lấy từ: http://biodegradablegeek.com/2008/04/how-to-post-form-data-using-ruby/

+2

Ví dụ về cách sử dụng delay_job trên đường ray của Ryan: http://railscasts.com/episodes/171-delayed-job –

+3

Đây là điều đầu tiên tôi thử. Thật không may nó mang lại cho tôi một lỗi 'kết thúc tập tin đạt được'. Từ tìm kiếm xung quanh có vẻ như những người khác đã có vấn đề tương tự. Bất cứ ai có bất kỳ thông tin chi tiết? –

+0

Để giải quyết lỗi EOF khi sử dụng https, hãy xem http://stackoverflow.com/a/9227933/1161743 –

4

Tôi không nghĩ redirect_to xử lý yêu cầu bài đăng vì nó sử dụng http 302 (?) Mà chỉ GET trang khác.

Tôi tin rằng bạn có thể làm điều gì đó như

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 

ghi chú này: đây là không khí được mã hóa và chưa được thử nghiệm hoặc kiểm định

29

Xin lỗi, tôi đã bỏ qua đề cập đến việc tôi đang kết nối với máy chủ bảo mật. Điều này có vẻ là lý do mà tôi đã nhận được kết thúc lỗi tập tin. Việc thêm sử dụng 'net/https' và gọi use_ssl trên kết nối đã giải quyết được sự cố. Cảm ơn mọi người đã giúp đỡ.

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

Điều này dựa trên nguồn cho phương thức post_form, vì vậy tôi đoán tôi sẽ cung cấp cho vlad.zloteanu câu trả lời.

+0

:) cũng .. 10qu, tôi rất vui vì nó đã giúp bạn. –

+1

Điều này có vẻ là làm việc tuyệt vời, tuy nhiên tôi đã mong đợi bộ điều khiển để thực hiện theo các chuyển hướng đến bài viết là tốt, nhưng nó không có vẻ là trường hợp? Bất kỳ ý tưởng nào làm thế nào tôi có thể làm điều đó? – Alex

+1

Một cái gì đó tôi chỉ làm việc ra ... thiết lập dòng cuối cùng để đáp ứng 'res = con.start {| http | http.request (req)} 'rất hữu ích. – Isaac

12

Nếu máy chủ bên ngoài là RESTful, sau đó chỉ cần tạo mô hình ActiveResource để xử lý dữ liệu của bạn.

Các vấn đề liên quan