Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby中的参数化get请求?_Ruby On Rails_Ruby_Http_Get - Fatal编程技术网

Ruby on rails Ruby中的参数化get请求?

Ruby on rails Ruby中的参数化get请求?,ruby-on-rails,ruby,http,get,Ruby On Rails,Ruby,Http,Get,如何使用Ruby中的参数发出HTTPGET请求 在POSTing时很容易做到: require 'net/http' require 'uri' HTTP.post_form URI.parse('http://www.example.com/search.cgi'), { "q" => "ruby", "max" => "50" } 但是我看不到使用'net/http'将GET参数作为散列传递的方法。请使用以下方法: require

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

POST
ing时很容易做到:

  require 'net/http'
  require 'uri'

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

但是我看不到使用
'net/http'
GET
参数作为散列传递的方法。请使用以下方法:

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)
我希望它在没有第二次实例化的情况下工作,因为它将是第一个请求对象或http对象的作业,但它对我来说是这样工作的

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


stack overflow是个新手,我想我不能评论,但是@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
从版本1.9.2开始(我认为),您实际上可以将参数作为散列传递给方法,如下所示:

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

使用:


可能并不完美,但至少你明白了。

肯定有更抽象的方法来实现这一点,不是吗?我认为Net::HTTP中没有这种方法……但你可以编写一个方法,该方法包含3个参数,域、路径和参数,并返回结果,因此,您不必每次都手动运行collect。@Horace Loeb没有必要对此进行抽象。抽象很简单,不会为您保存任何代码。这里的
reverse
有什么意义?假设散列是无序的(通常),并且查询中变量的顺序无关紧要。如果不使用,请使用
http://www.google.de/search?q=cheese“
,使用对我有效的
::GET.new(uri.to)
跳过名称不正确的集合表单数据,没有无望的第二次
new
实例化。net/http库转换早就应该进行了!删除逗号:D uri=uri.parse(')注意
uri.encode\u www\u form(foo:“bar,baz”)
产生
foo=bar&foo=baz
。如果这不是您所期望的,我建议使用
CGI.escape
或更全面的功能(如RestClient gem)的公认答案。
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)
conn = Excon.new('http://www.example.com/search.cgi')
conn.get(:query => { "q" => "ruby", "max" => "50" })
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