2009-08-09 19 views
37

¿Cómo realizo una solicitud HTTP GET con parámetros en Ruby?Solicitud de obtención parametrizada en Ruby?

Es fácil de hacer cuando estás POST ING:

require 'net/http' 
    require 'uri' 

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

pero no veo forma de pasar parámetros GET como un hash utilizando 'net/http'.

Respuesta

28

utilizar el siguiente método:

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

Seguramente debe haber una forma más abstracta de hacer esto, ¿no? –

+0

No creo que exista en Net :: HTTP ... pero podrías escribir un método que tome 3 parámetros, el dominio, la ruta y los parámetros, y devuelve el resultado, para que no tengas que ejecutar el recoger manualmente cada vez. –

+0

@Horace Loeb No tiene sentido abstraer esto. Es tan simple que una abstracción no te va a ahorrar ningún código. – 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 

yo esperaría que funcione sin la segunda instancias, ya que sería la primera solicitud de objetos o de empleo del http-objeto, sino que trabajó para mí esto camino.

+2

si lo hace 'URI.parse (" http://www.google.de/search?q=cheese ")', omita el mal llamado set_form_data, usando '.. :: GET.new (uri.to_s)' eso funcionó para mí, sin la segunda instantánea "nueva" sin esperanza. ¡El cambio de net/http lib hace mucho tiempo! – 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

nuevo a desbordamiento de pila y supongo que no puedo comentar, pero @ chris.moose falta comillas dobles en su definición de función. línea 5 debe ser:

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

o aquí está todo el asunto redefinido para copiar/pegar

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

Desde la versión 1.9.2 (creo) en realidad se puede pase los parámetros como un hash al método URI::encode_www_form como este:

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) 

y luego recoger el resultado, dependiendo de su preferencia

require 'open-uri' 

puts uri.open.read 

o

require 'net/http' 

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

¡¡¡ES TIEMPO DE TIEMPO LOL !!!!! –

+0

¡Funciona como un encanto! –

+0

eliminar la coma: 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 

Puede que no sea perfecto, pero al menos que presentamos lo mejor idea.

Cuestiones relacionadas