RubyでNet::HTTPを用いてPOSTする方法とは?

このQ&Aのポイント
  • RubyでNet::HTTPを使用してPOST送信する方法について教えてください。
  • Net::HTTPクラスのpostメソッドを使用して送信する際、パラメータのデリミタとして&を含む値を渡す方法についても教えてください。
  • Net::HTTP::Postクラスのrequestメソッドとは異なり、postメソッド使用時にキチンと値を取得できない場合、対処方法があるのか教えてください。
回答を見る
  • ベストアンサー

Rubyでnet::httpを用いてPOSTする

今晩わ。 RubyでNet::HTTPをもちいてPOST送信する際の処理について 質問です。 Net::HTTPクラスのインスタンスメソッドのpostメソッドを用いて送信する場合 送信内容を # version 1.2 (Ruby 1.8.x or later) response = http.post('/cgi-bin/search.rb', 'query=subject&target=ruby') 上記のように、引数に渡していると思います。 このとき、値の中にパラメータのデリミタと同じ&を入れたい場合どうしたらいいのでしょうか? 例えば query=subject&target=ruby&PHP のような感じでvalueとして&を渡す場合です。 Net**HTTP::Postクラスのrequestメソッドを用いてハッシュとして渡した時は問題なかったのですが、上記のpostメソッドの時がPOSTされた値を取得するときにキチンと取得できませんでした。これはなにか対処方法があるのでしょうか? ご教授ください。 おねがいします。

  • Ruby
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.1

この辺ちゃんと使った経験が無いので、「普通こうする」という回答にはなって無いかもしれませんが・・・ >Net**HTTP::Postクラスのrequestメソッドを用いてハッシュとして渡した時 これは、 #set_form_data (#form_data=) で予め値を入れたっていうことですよね? net/http ライブラリのソースを覗いてみると、set_form_dataの方はエンコードかけていますが、HTTP#postの2引数目はそのまま文字列として取り扱っているみたいです。 ということで、一度きりの使い捨てなら「query=subject&target=ruby&PHP」を「query=subject&target=ruby%26PHP」へ書き換えれば済むんじゃないでしょうか。 こういう使い方が多いのであれば、ヘルパーメソッド作っておいてもいいかもしれませんが・・・ https://ideone.com/3fi2I そもそも、HTTP#post側だとこういう用法を想定していないのかもしれませんね。 フォームのデータ送るなら、#form_data=を予め使っておく方が素直なのかもしれません。

1000vicki
質問者

お礼

なるほど・・。postメソッドを使いたい理由は、単純に記述が短くてすむかなとおもたからです。 Net::HTTP::Postとだと、間にワンクッション挟むことになるので ちょこと冗長になるかなと・・・・・・。 Net::HTTP::Postをつかって自分で、楽な自作メソッドつくったほうがいいかもですね・・。

関連するQ&A

  • Ruby:net/httpライブラリで質問です。

    RubyでWEBAPIをたたこうとおもい リファレンスから require 'net/http' Net::HTTP.version_1_2 # おまじない Net::HTTP.start('www.example.com', 80) {|http| response = http.get('/index.html') puts response.body } という記述を利用してヤフーのページを取得しようと 動かしたところまったく動作しなかったのでだめもとで例外をとってみたら begin Net::HTTP.version_1_2() # おまじない Net::HTTP.start("http://yahoo.co.jp", 80) {|http| response = http.get("/index.html"); puts response.body } rescue => ex print ex.class; print "<hr />"; print ex.message; print "<hr />"; print ex.backtrace; end SocketErrorgetaddrinfo: 記憶域制御ブロックが壊れています。 C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `initialize'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `open'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/timeout.rb:53:in `timeout'C:/ruby/lib/ruby/1.8/timeout.rb:101:in `timeout'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:553:in `do_start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:542:in `start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:440:in `start'C:/Apache/htdocs/tokui12.rb:11 上記のような例外が取れました。 これは、Rubyの際インストールが必要なのでしょうか? リファレンスまんまを利用しているので記述間違いとかはないと思うのですが・・・ システム的な問題?と思いPHPでたたいたところ PHPであれば普通にAPIはたたけました。 対処策はどうしたらいいのでしょうか?

    • ベストアンサー
    • Ruby
  • パラメータをruby

    postでa.htmlから送られたパラメータをrubyで取得して、 取得したパラメータをrubyからb.htmlに送信するには rubyのプログラムをどのように組めばいいのでしょうか?

    • ベストアンサー
    • Ruby
  • Ruby net/httpについて

    Rubyで#!/ruby/bin/ruby require 'net/http' require 'uri' print "content-type: text/html\r\n\r\n"; begin url = "http://~~~.com/" Net::HTTP.get_print URI.parse(url) rescue => ex print ex.class; print "<hr />"; print ex.message; print "<hr />"; print ex.backtrace; end というようなコードで指定のURLの内容をgetしたいと思っています。 が、とりあえずは上記内容でURL先の内容は取得できるのですが url = "http://www.~~~.com"; という風にwwwをつけるとスクリプトがうごかずURL先の内容が取得できないのです。 原因はなんなのでしょうか? 識者のかたご教授ください。

    • ベストアンサー
    • Ruby
  • InetでHTTPのPOST設定方法

    Inetコントロールで、HTTPサーバにPOSTを使用しデータを送信しようと考えているのですが、 いろいろ調べたところ、できるようになりました。 ソースは以下の通りです。 Inet1.Execute "アドレス" _, "POST" _, "msg=あああ" _, "Content-Type: application/x-www-form-urlencoded" 上記のソースでサーバ側でmsgと指定し「あああ」という値を 取得することができました。 しかし、POSTで複数のデータを送ることができません。 例えば値をnameとmsgの二つを送る場合、 "msg=あああ"の部分にどのように記述すればよいのでしょうか? それとも根本的に何か違うのでしょうか? よろしくお願いします。

  • RubyのHTTP POSTについて

    HTTP POSTについてお聞きしたいです。 http://ligin.weizmann.ac.il/~lpgerzon/mbs4/mbs.cgi のページに、自動で入力を投げて答えを返してもらうスクリプトを書きたいです。 dataに、Inputする文字列を&でつないで、 Net::HTTP.start('ligin.weizmann.ac.il', 80) {|http| response = http.post('/~lpgerzon/mbs4/mbs.cgi',data) puts response.body } という方法で実行してみたのですが、 帰ってくる出力が、上記のURIのソースのままになってしまいます。 GUIでクリックして入力した場合は、末尾がmbs3.cgiのページに移動するはずなのですが、 なぜか上手く入力を与えることができません。 説明が曖昧で申し訳ありません。 アドバイスなどだけでも構いませんので、 よろしくお願い致します。

    • ベストアンサー
    • Ruby
  • WindowsアプリにPOSTのパラメータを渡す

    WebフォームからPOSTメソッドで送信したパラメータを、.NETのスマートクライアントに引き渡す方法を考えています。 ノータッチデプロイメントのスマートクライアントはどうやらクエリストリングを受け取ることはできるようですがPOSTが受け取れません。 現在試しているのはいったん、クエリストリングをASP.NETで受け取り、クエリストリングに変換してスマートクラインアントのページに転送するやりかたです。 この転送をサーバ内で処理しようとする(つまりServer.Transferを用いる)とブラウザはダウンロードされるのが.exeだとは気づかすテキストとして扱ってしまいます。Response.Ridirectを用いるとうまくいくのですが、これは結局クライアントがGETメソッドを投げてしまうので、できれば避けたい状況です。 なにかいい方法はないでしょうか?

  • HTTPハンドラでPOSTした値を受け取りたい。

    C♯でASP.NET環境にて開発をしています。 htmlにボタン(submit)を置いて、postが来たら、ashx(HTTPハンドラ) のほうでリクエスト値を見てDBから値を取り、結果を返したいと思っています。 結果については、JavaScriptのほうでinnerHTMLを使って反映させる予定です。 オンロードでJavaScriptのメソッドを呼んでるんですが (body onload = "test();") (input type hiddenでいくつかの値がpostされるように なっています) function test() { var ret = new Ajax.Request('GetValue.ashx'),{ method:'post' … } こんな感じでashxを呼んでるものの、htmlでpostした値が 受け取れません。 context.Request.Querystringで取ろうとしてるんですが… htmlでリクエストした際に、JavaScriptを呼んで、そこでajaxリクエストをしている という作りがまずいのでしょうか? HTTPハンドラを使うのが始めてなので、頓珍漢なことをしているかも しれませんが、ご教授いただけると助かります。 宜しくお願いします。

  • CGI:method="post"でもGETになる

    CGIで標準入力によりフォームデータを取得できないため、環境変数%ENV内の値を 調べましたところ、入力フォーム(html)のformタグでmethod="POST"と明示しているにも 拘らず、REQUEST_METHODの値がGETになっており、POST用のCONTENT_LENGTHも GET用のQUERY_STRINGも共に空になっております。 htmlでmethod="GET"と指定した場合には、REQUEST_METHODの値は正しくGETになり QUERY_STRINGからフォームデータを取得できます。 同じCGIをPC上のApache2.4でテストした結果、REQUEST_METHODはhtmlのmethod=~で 指定した通り正しくPOSTまたはGETとなり、それぞれフォームデータを 取得できることを確認いたしております。 この点についてプロバイダに問合せいたしましたが、サポート対象外ということで、 回答を得ることができませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただけないでしょうか、お伺いいたします。 (1)ホスト動作環境 a.CGIサーバ:Apache b. perl 5.10系 (2)PC動作環境 a.OS: Windows 7 b.ブラウザ: Internet Eexplorer 11 c.CGIサーバ: Apache 2.4 d. Activeperl 5.20

    • 締切済み
    • CGI
  • Rubyのソースコードの読み方

    現在JavaからRubyに移行しようと勉強をしているのですが、Rubyのソースコードを読んでいくと、変数に何が入っているかわからなくて困っています。 ソースコードを例に説明させていただくと、 gs = TCPServer.open(12345) addr = gs.addr こんなソースがあったとして、2行目のgs.addrというメソッドが何をするメソッドなのか知りたいとします。 しかしRubyでは型宣言をしないので、gsが何のクラスなのかわかりません。 そこでTCPServerクラスのリファレンス(http://www.ruby-lang.org/ja/old-man/html/TCPServer.html)を見るのですが、このサイトのクラスメソッド欄にかいてあるTCPServer.openを呼んでも、戻り値の型が書いていません。 このような場合どうやって、gs.addrメソッドの挙動をしればよいのでしょうか?なお現在は動的にデバックするという方法は無しで考えています。 ご回答よろしくおねがいします。

    • ベストアンサー
    • Ruby
  • ASP.netで動的な値をPOST送信

    以下を使用しています。 ASP.net(WEBフォーム) c# 画面イメージ ・Aさん ・Bさん ・Cさん 送信ボタン ・はラジオボタンです。 やりたいこと (1)送信ボタンを押下したときに、ラジオボタンが選択されている人の情報をDB検索する (2)取得してきた住所等を別システムのURLウィンドウを開き、POST送信で住所等を送信する。 開いた別ウィンドウではPOST送信した内容が表示されるのですがそれは別チームが対応するため考慮不要です (1)まではできます (2)ネットで調べたのですがPOST送信はform等htmlに埋め込みされた値の送信はできるのですが このページが表示された時点では住所等の取得は行っていないため埋め込みできません 送信ボタン押下時に画面を書き換えた後には送信できそうですが、できれば画面の見た目は変わらないでほしいです。 postbackすると画面が再描画されてしまう。。。。 質問 動的な値を別システムのURLウィンドウにPOST送信するにはどのように実現すればよろしいでしょうか? よろしくお願いします。

専門家に質問してみよう