Ruby中的参数化get请求?

Tom*_*man 38 ruby get ruby-on-rails http

如何GET在Ruby中使用参数发出HTTP 请求?

当你正在做的时候很容易做到POST:

  require 'net/http'
  require 'uri'

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

但我认为没有办法将GET参数作为哈希使用传递'net/http'.

lim*_*ime 75

从版本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 )
Run Code Online (Sandbox Code Playgroud)

然后根据您的偏好获取结果

require 'open-uri'

puts uri.open.read
Run Code Online (Sandbox Code Playgroud)

要么

require 'net/http'

puts Net::HTTP.get(uri)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`URI.encode_www_form(foo: "bar,baz")` 产生了 `foo=bar&foo=baz`。如果这不是您所期望的,我推荐使用`CGI.escape` 或更好但功能更全的东西,如 RestClient gem。 (2认同)

小智 31

使用以下方法:

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)
Run Code Online (Sandbox Code Playgroud)

  • 当然必须有更抽象的方法来做到这一点,不是吗? (11认同)
  • 而不是使用`if not`使用`除非` (4认同)

mar*_*arc 19

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
Run Code Online (Sandbox Code Playgroud)

我希望它能在没有第二个实例化的情况下工作,因为它将是第一个请求对象或http对象的工作,但它以这种方式对我有用.

  • 如果你做`URI.parse("http://www.google.de/search?q=cheese")`,跳过命名错误的set_form_data,使用`.. :: GET.new(uri.to_s)`为我工作,没有绝望的第二次"新"实例化.net/http lib转换早就应该了! (2认同)

小智 5

Net::HTTP.get_print 'localhost', '/cgi-bin/badstore.cgi?searchquery=crystal&action=search&x=11&y=15'
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)