如何在Rails中读取POST信息?

时间:2011-01-20 00:44:02

标签: ruby-on-rails ruby httpwebrequest

我想知道如何通过HTTP POST请求发送和接收信息。

我正在使用Ruby v.1.8.7和rails 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所以我知道它何时起作用,但到目前为止还没有...

3 个答案:

答案 0 :(得分:2)

要在您的应用程序中接收请求,请在config/routes.rb中为其设置路由。有关详细信息,请参阅Routing Guide。将其路由到控制器,然后使用params方法访问发送的信息。

至于发送回数据...替代andrea的答案,您可以使用Typhoeus gem来发出HTTP请求。它有一个非常简洁的语法,我最近一直在使用它而不用担心。

答案 1 :(得分:2)

您是否尝试从其中一个控制器发布到相同的rails应用程序?如果您在单个webrick / mongrel实例上运行此操作,则只能处理一个请求。因此,如果您从浏览器向您的应用程序发出请求,并且此请求需要向同一个应用程序发出另一个请求(阻止第一个应用程序),那么它将会卡住并且只是超时。

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

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

答案 2 :(得分:1)

接收发布请求,您只需在控制器中创建操作并使用方法发布设置路由。

发送请求你可以使用类似的东西

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)