2009-08-09 14 views
37

Rubyでパラメータを使用してHTTP GETリクエストを作成するにはどうすればよいですか?Rubyでパラメータの取得リクエストがありますか?

require 'net/http' 
    require 'uri' 

    HTTP.post_form URI.parse('http://www.example.com/search.cgi'), 
       { "q" => "ruby", "max" => "50" } 

しかし、私は'net/http'を使用してハッシュとしてGETパラメータを渡すのない方法を見ていない:あなたはPOST INGいるとき

それは何をするのは簡単です。それが最初の要求、オブジェクトまたはHTTPオブジェクトの仕事だろうと私はそれが第二のインスタンス化せずに動作するように期待される

require 'net/http' 
require 'cgi' 

def http_get(domain,path,params) 
    return Net::HTTP.get(domain, "#{path}?".concat(params.collect { |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.join('&'))) if not params.nil? 
    return Net::HTTP.get(domain, path) 
end 

params = {:q => "ruby", :max => 50} 
print http_get("www.example.com", "/search.cgi", params) 

答えて

28

は、以下の方法を使用します方法。

+11

これを行うにはもっと抽象的な方法が必要ですか? –

+0

私はそこにNet :: HTTP ...があるとは思わないが、3つのパラメータ、ドメイン、パス、およびパラメータを取り、結果を返すメソッドを書くことができるので、実行する必要はありません。毎回手動で収集してください。 –

+0

@Horace Loeb これを要約する要点はありません。抽象化が簡単なので、コードを保存することはありません。 – Henry

18
require 'net/http' require 'uri' 

uri = URI.parse("http://www.google.de/search"); params = {'q'=>'cheese'} 

http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.path) 
request.set_form_data(params) 

# instantiate a new Request object 
request = Net::HTTP::Get.new(uri.path+ '?' + request.body) 

response = http.request(request) 
puts response.body 

が、それは私の本のために働い:

+2

'URI :: parse(" http://www.google.de/search?q=cheese ")'を実行した場合は、 '.. :: GET.new(uri.to_s)'を使って悪い名前のset_form_dataをスキップしてください。無駄な第2の新しいインスタンス化なしで私のために働いた。 net/http libの切り替えは長すぎます! – oma

5
Net::HTTP.get_print 'localhost', '/cgi-bin/badstore.cgi?searchquery=crystal&action=search&x=11&y=15' 

または

uri = URI.parse("http://localhost") 
req = Net::HTTP::Get.new("/cgi-bin/badstore.cgi?searchquery=crystal&action=search&x=11&y=15") 

http = Net::HTTP.new(uri.host, uri.port) 

response = http.start do |http| 
    http.request(req) 
end 
2

スタックオーバーフローに新しいと私はコメントすることはできませんと思いますが、chris.moose @彼の関数defの中に二重引用符が欠落しています。 5行目は次のようになります。貼り付け/

return Net::HTTP.get(domain, "#{path}?".concat(params.collect { |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.reverse.join('&'))) if not params.nil? 

またはここにコピーするために再定義全体のことだ

require 'net/http' 
require 'cgi' 

def http_get(domain,path,params) 
    return Net::HTTP.get(domain, "#{path}?".concat(params.collect { |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.reverse.join('&'))) if not params.nil? 
    return Net::HTTP.get(domain, path) 
end 

-mike

66

バージョン1.9.2(と思う)あなたが実際にすることができるのでパラメータをハッシュとして、次のように

require 'uri' 

uri = URI.parse('http://www.example.com/search.cgi') 
params = { :q => "ruby", :max => "50" } 

# Add params to URI 
uri.query = URI.encode_www_form(params) 
メソッドに渡します。

、その後はお好み

require 'open-uri' 

puts uri.open.read 

または

require 'net/http' 

puts Net::HTTP.get(uri) 
+3

時間は笑っています!!!!! –

+0

魅力的な作品です! –

+0

カンマを削除します。D uri = URI。parse( 'http://www.example.com/search.cgi') –

4

使用Exconに応じて、結果をフェッチ:

conn = Excon.new('http://www.example.com/search.cgi') 
conn.get(:query => { "q" => "ruby", "max" => "50" }) 
0
This is the easiest way to do it 

require 'net/http' require 'uri' 
@siteurl = "http://www.google.de/search/#{@yourquery}" 
define your query 
@yourquery = "whatever" 



uri = URI.parse("@siteurl"); 
http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.path) 

# instantiate a new Request object 
request = Net::HTTP::Get.new(uri.path+ '?' + request.body) 

response = http.request(request) 
puts response.body 

は完璧ではないかもしれませんが、少なくともあなたが得ますアイディア。

関連する問題