2009-08-09 11 views
37

Comment faire une requête HTTP GET avec des paramètres dans Ruby?Paramétré Obtenir une requête dans Ruby?

Il est facile à faire quand vous êtes POST ING:

require 'net/http' 
    require 'uri' 

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

Mais je ne vois aucun moyen de passer GET paramètres comme un hachage en utilisant 'net/http'.

Répondre

28

Utilisez la méthode suivante:

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

Sûrement il doit y avoir une façon plus abstraite de le faire, non? –

+0

Je ne pense pas qu'il existe dans Net :: HTTP ... mais vous pouvez simplement écrire une méthode qui prend 3 paramètres, le domaine, le chemin et les paramètres, et renvoie le résultat, de sorte que vous n'avez pas à exécuter le collecter manuellement à chaque fois. –

+0

@Horace Loeb Il est inutile d'abstraire ceci. C'est tellement simple qu'une abstraction ne va pas vous sauver de code. – 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 

j'attendre de travailler sans la deuxième instanciation comme ce serait la première demande-objets ou le travail du http-objet, mais cela a fonctionné pour moi cette façon.

+2

si vous faites 'URI.parse (" http://www.google.de/search?q=cheese ")', ignorez mal le set_form_data, en utilisant '.. :: GET.new (uri.to_s)' cela a fonctionné pour moi, sans la seconde instanciation désespérée. Le changement net/http lib est en retard! – oma

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

ou

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

nouveau pour dépassement de la pile et je suppose que je ne peux pas commenter, mais @ chris.moose manque des guillemets doubles dans sa définition de la fonction. ligne 5 devrait être:

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

ou est ici la chose redéfinie pour copier/coller

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

Depuis la version 1.9.2 (je pense) que vous pouvez réellement passer les paramètres comme un hachage à la méthode URI::encode_www_form comme ceci:

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) 

et ensuite récupérer le résultat, en fonction de vos préférences

require 'open-uri' 

puts uri.open.read 

ou

require 'net/http' 

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

C'EST LE TEMPS LOL !!!!! –

+0

Fonctionne comme un charme! –

+0

supprimer la virgule: D uri = URI.analyser ('http://www.example.com/search.cgi') –

4

Utilisation 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 

peut-être pas parfait, mais au moins vous obtenez la idée.

Questions connexes