2011-01-20 26 views
3

HTTP POSTリクエストを通じて情報を送受信する方法を知りたいです。RailsでPOST情報を読むにはどうすればよいですか?

私はRuby v.1.8.7とrails v.2.3.8を使用しています。

EDIT:

私の行動のコードは次のとおりです。

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

+0

さて、私は購入方法を解析して読むことができるように、私はPOSTを通してXMLを提供する支払い方法の会社からいくつかのデータを受け取るでしょう。それを読んだ後、私のアプリはそれ以降POSTでリクエストを送信する必要があるので、データを送受信する必要があります。 –

答えて

2

コントローラの1つと同じレールアプリケーションに投稿しようとしていますか?単一のwebrick/mongrelインスタンスでこれを実行している場合は、1つのリクエストのみを処理できます。したがって、ブラウザからアプリにリクエストを行い、このリクエストが同じアプリケーション(最初のリクエストをブロックする)に別のリクエストを行う必要がある場合、スタックされてタイムアウトします。

コントローラに2番目のリクエストが必要な理由がわかりません。別のコントローラ/アクションでコードを実行する必要があるようです。他のコントローラ/アクションにリダイレクトすることもできますが、GETリクエストが必要です。コントローラからモデルまたはモジュールにコードを移動し、両方のコントローラアクションから適切なメソッドを呼び出します。

編集: お支払いプロセッサの統合をテストする場合は、アプリケーションでエミュレートするのではなく、テスト環境を使用する必要があります。支払い処理をエミュレートするコードを本当に作成する必要がある場合は、独自のwebrick/mongrelインスタンスで実行されている別のアプリケーションで行う必要があります。その後、他のアプリケーションにリクエストを行うことができます。

+0

実際にテスト環境を持っていればいいかもしれませんが、テスト環境はありません。だから私は自分のアプリにPOST要求をシミュレートしようとしているので、正しく処理していると思います。私はブラウザからの投稿を試み、あなたに知らせます。 –

+0

Teoulasが示唆するように、同時実行性の問題だと思います。あなたはそれを明示的に言っていませんが、あなたのコントローラのアクションの中からPOSTをしようとしていると思います。一度に1つのリクエストだけを処理するアプリケーションにリクエストを出そうとしているので、時間がかかりすぎてタイムアウトしてしまいます。彼の提案に従うと、あなたの問題が解決されるはずです。また、delayed_jobを使用して、サードパーティのリクエストを現在のリクエスト/レスポンスサイクルから移動することを検討する必要があります。サードパーティがダウンしているためにアプリケーションがハングしないようにする必要があります。 – davemyron

1

受信しますポストリクエストでは、コントローラにアクションを作成し、メソッドポストでルートを設定するだけです。あなたはそれのためconfig/routes.rbにルートを設定し、アプリケーションに要求を受信するには似たような

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

私はこれを試しましたが、 "実行期限切れ"と表示されるまで、ページをしばらくロードし続けます。理由は分かりますか?私は自分のコードで投稿を編集します。 –

+0

あなたが投稿したコードがアクション "parse_received_data"にある場合は、ループを引き起こしたコードを呼び出すアクションがあります。 URI.parse( 'http:// localhost:3000/ipn/payments')のuriを変更してください。私が誤解した場合はごめんなさい。 – andrea

2

を使用することができ、要求を送信するために

。詳細については、Routing Guideを参照してください。それをコントローラにルーティングし、paramsメソッドを使用して送信された情報にアクセスします。

データを返信します...アンドレアの回答の代わりに、Typhoeus gemを使用してHTTPリクエストを行うことができます。それは本当にきちんとした構文を持っています。私は最近心配することなくそれを使っています。

+0

#Typhoeus素敵な提案、知っておきたいこと。タンク – andrea

関連する問題