2009-08-09 44 views
37

Làm cách nào để thực hiện yêu cầu HTTP GET với thông số trong Ruby?Parametrized nhận được yêu cầu trong Ruby?

Thật dễ dàng để làm khi bạn đang POST ing:

require 'net/http' 
    require 'uri' 

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

Nhưng tôi thấy không có cách nào đi qua GET thông số như một hash sử dụng 'net/http'.

Trả lời

28

Sử dụng các phương pháp sau đây:

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

Chắc chắn phải có cách trừu tượng hơn để thực hiện việc này, phải không? –

+0

Tôi không nghĩ rằng có trong Net :: HTTP ... nhưng bạn chỉ có thể viết một phương pháp mà có 3 tham số, tên miền, đường dẫn, và các thông số, và trả về kết quả, vì vậy bạn không cần phải chạy thu thập thủ công mỗi lần. –

+0

@Horace Loeb Không có điểm trừu tượng điều này. Nó đơn giản như vậy một trừu tượng sẽ không giúp bạn tiết kiệm bất kỳ mã nào. – 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 

Tôi mong chờ nó làm việc mà không instantiation thứ hai vì nó sẽ yêu cầu các đối tượng đầu tiên hoặc công việc http-đối tượng, nhưng nó làm việc đối với tôi đây đường.

+2

nếu bạn thực hiện 'URI.parse (" http://www.google.de/search?q=cheese ")', bỏ qua set_form_data có tên kém, sử dụng '.. :: GET.new (uri.to_s)' đã làm việc cho tôi, không có sự khởi tạo thứ hai mới mẻ vô vọng. Thay đổi lib net/http quá dài! – oma

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

hoặc

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

mới để ngăn xếp tràn và tôi đoán tôi không thể bình luận, nhưng @ chris.moose thiếu dấu ngoặc kép trong def chức năng của mình. dòng 5 nên là:

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

hoặc đây là toàn bộ sự việc định nghĩa lại cho sao chép/dán

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

Kể từ phiên bản 1.9.2 (tôi nghĩ), bạn có thể thực sự chuyển các tham số dưới dạng hàm băm sang phương thức URI::encode_www_form như sau:

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) 

và sau đó lấy kết quả, tùy thuộc vào sở thích của bạn

require 'open-uri' 

puts uri.open.read 

hoặc

require 'net/http' 

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

NÓ VỀ THỜI GIAN LOL !!!!! –

+0

Hoạt động như một sự quyến rũ! –

+0

xóa dấu phẩy: D uri = URI.phân tích cú pháp ('http://www.example.com/search.cgi') –

4

Sử dụng 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 

Có thể không được hoàn hảo nhưng ít nhất bạn sẽ có được ý kiến.

Các vấn đề liên quan