39 votes

Paramétrer la requête get en Ruby?

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

C'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 les paramètres GET comme un hachage en utilisant 'net/http' .

77voto

lime Points 1382

Depuis la version 1.9.2 (je pense), vous pouvez réellement passer les paramètres sous forme de 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 )
 

puis récupérer le résultat, selon vos préférences

 require 'open-uri'

puts uri.open.read
 

ou

 require 'net/http'

puts Net::HTTP.get(uri)
 

32voto

Chris Moos Points 521

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)
 

19voto

marc Points 131
 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
 

Je m'attendrais à ce qu'il fonctionne sans la seconde instanciation car ce serait le premier objet de demande ou le travail de l'objet http mais cela a fonctionné pour moi de cette façon.

5voto

mike Points 51
 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
 

4voto

Alex Dean Points 3997

Utilisez Excon :

 conn = Excon.new('http://www.example.com/search.cgi')
conn.get(:query => { "q" => "ruby", "max" => "50" })
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X