2011-01-20 58 views
3

我想知道如何通过HTTP POST请求发送和接收信息。如何在Rails中读取POST信息?

我使用Ruby v.1.8.7和轨道v.2.3.8。

编辑:

我的动作的代码如下:

require 'net/http' 

# get the url that we need to post to 
url = URI.parse('http://localhost:3000/ipn/payments') 

xml_notificaciones = "<NOTIFICACION><TIPONOTIFICACION>1</TIPONOTIFICACION><OPERACIONES><OPERACION><TIPO>1</TIPO><ID>31548</ID></OPERACION><OPERACION><TIPO>1</TIPO><ID>XA5547</ID></OPEARACION></OPERACIONES></NOTIFICACION>" 

# build the params string 
post_args1 = { 'NOTIFICACION' => xml_notificaciones } 
# send the request 
resp, data = Net::HTTP.post_form(url, post_args1) 

当我执行上面的代码,页面会一会加载,直到我得到execution expired消息。

但事实上我对http://localhost:3000/ipn/payments URL一个路由条目,如下:

map.received_ipn_payments '/ipn/payments', :controller => 'payments', :action => 'parse_received_data', :method => :post 

我有一个raise params.inspect所以我知道什么时候它的工作原理,但没有那么远,

+0

你的问题是有点暧昧 - 你的意思是你希望你的Rails应用程序,以便能够从浏览器,而是从外部Web服务发送和接收HTTP请求,想必不是? – vonconrad 2011-01-20 00:46:38

+0

嗯,我会从付款方式的公司收到一些数据,这些数据将通过POST提供给我一个XML,以便我可以解析和阅读购买。读完之后,他们要求我的应用程序通过POST向他们发送请求,所以这就是为什么我需要发送和接收数据。 – 2011-01-20 00:59:43

回答

2

你们是不是要张贴到您的控制器之一相同的Rails应用程序?如果您在单个webrick/mongrel实例上运行此操作,则只能处理一个请求。因此,如果您从浏览器向您的应用程序发出请求,并且此请求需要向同一个应用程序发出另一个请求(这将阻止第一个应用程序),则它会卡住并超时。

我不知道为什么你需要你的控制器做了第二次请求,在我看来,你需要在另一个控制器/动作运行代码。您可以重定向到其他控制器/操作,但需要GET请求,或者将代码从控制器移到模型或模块,并从两个控制器操作中调用适当的方法。

编辑: 如果您试图测试您的付款处理器集成,您应该使用他们的测试环境(假设他们有一个),而不是在应用程序中模拟它。如果您确实需要编写代码来模拟付款流程,那么您应该在运行其自己的webrick/mongrel实例的其他应用程序中执行此操作。然后你就可以向其他应用程序发出请求。

1

接收一个帖子请求你只需要在控制器中创建一个动作,并用method post设置路由。

送您可以使用类似

require 'net/http' 
# get the url that we need to post to 
url = URI.parse('http://www.url.com/subscribe')# build the params string 
post_args1 = { 'email' => params[:email] } 
# send the request 
resp, data = Net::HTTP.post_form(url, post_args1) 
+0

我试过这个,但它一直加载页面一段时间,直到它说“执行过期”,你知道为什么吗?我将用我的代码编辑帖子。 – 2011-01-20 01:50:29

+0

也许,如果您发布的代码位于操作“parse_received_data”中,那么您的操作会导致回调本身导致循环。在URI.parse('http:// localhost:3000/ipn/payments')中更改URI。对不起,如果我误解了。 – andrea 2011-01-20 02:33:17

2

东西收到请求到应用程序中,设置了路线config/routes.rb它的请求。有关更多信息,请参见Routing Guide。将其路由到控制器,然后通过使用params方法访问发送的信息。

至于发回的数据...替代安德烈的回答,您可以使用Typhoeus宝石,使HTTP请求。它有一个非常整齐的语法,我最近一直在使用它,不用担心。