Параметризованный запрос на получение в Ruby? - PullRequest
38 голосов
/ 10 августа 2009

Как мне сделать HTTP GET запрос с параметрами в Ruby?

Это легко сделать, когда вы POST ing:

  require 'net/http'
  require 'uri'

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

Но я не вижу способа передачи GET параметров в виде хэша, используя 'net/http'.

Ответы [ 7 ]

73 голосов
/ 03 апреля 2012

Начиная с версии 1.9.2 (я думаю), вы можете передать параметры в виде хэша методу URI :: encode_www_form , например:

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)
29 голосов
/ 10 августа 2009

Используйте следующий метод:

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)
18 голосов
/ 16 сентября 2009
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

Я ожидал бы, что он будет работать без второго экземпляра, так как это будут первые объекты запроса или работа http-объекта, но у меня это сработало так.

5 голосов
/ 13 мая 2010
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
4 голосов
/ 12 августа 2013

Использование Excon :

conn = Excon.new('http://www.example.com/search.cgi')
conn.get(:query => { "q" => "ruby", "max" => "50" })
2 голосов
/ 19 июля 2010

новый для переполнения стека, и я думаю, я не могу комментировать, но @ 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

<3 -Mike </p>

0 голосов
/ 31 августа 2016
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

Может быть и не идеально, но, по крайней мере, вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...