2009-08-09 19 views
37

Come si effettua una richiesta HTTP GET con parametri in Ruby?I parametri ottengono la richiesta in Ruby?

E 'facile da fare quando si è POST ing:

require 'net/http' 
    require 'uri' 

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

ma non vedo modo di passare GET parametri come hash utilizzando 'net/http'.

risposta

28

utilizzare il seguente metodo:

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) 
+11

Sicuramente ci deve essere un modo più astratto per fare questo, no? –

+0

Non penso ci sia in Net :: HTTP ... ma potresti semplicemente scrivere un metodo che richiede 3 parametri, il dominio, il percorso e i parametri, e restituisce il risultato, quindi non devi eseguire il raccogliere manualmente ogni volta. –

+0

@Horace Loeb Non c'è alcun punto che lo astragga. È così semplice che un'astrazione non ti farà risparmiare alcun codice. – 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 

mi aspetto di lavorare senza la seconda esemplificazione come sarebbe la prima richiesta-oggetti o il lavoro del http-oggetto, ma ha funzionato per me questo modo.

+2

se si esegue 'URI.parse (" http://www.google.de/search?q=cheese ")', salta il nome errato set_form_data, usando '.. :: GET.new (uri.to_s)' quello ha funzionato per me, senza la seconda instancabile istanziazione "nuova". Il cambio net/http lib è da tempo in ritardo! – oma

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

o

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

nuovo a Stack Overflow e credo non posso commentare, ma @ chris.moose manca virgolette doppie nella sua funzione di def. linea 5 dovrebbe essere:

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

o ecco il tutto ridefinito per copiare/incollare

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

A partire dalla versione 1.9.2 (credo) si può effettivamente passare i parametri come hash al metodo URI::encode_www_form in questo modo:

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) 

e poi prendere il risultato, a seconda delle preferenze

require 'open-uri' 

puts uri.open.read 

o

require 'net/http' 

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

È TEMPO DI LOL !!!!! –

+0

Funziona come un fascino! –

+0

rimuovere la virgola: D uri = URI.parse ('http://www.example.com/search.cgi') –

4

Uso 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 

potrebbe non essere perfetto, ma almeno voi otteniate idea.

Problemi correlati