2011-05-11 33 views
0

需要給Ruby的Net:HTTP一個完整的URL,以便它連接到服務器並正確獲取文件。 「完整網址」是指包含http://部分的URL和尾部斜槓(如果需要的話)。例如,Net:HTTP將不會連接到如下所示的URL:example.com,但會很好地連接到http://example.com/。有什麼方法可以確保一個URL是一個完整的URL,如果不是,則添加所需的部分?在Ruby的Net :: HTTP中使用一個字符串中的URL

編輯:這裏是我使用的代碼:

parsed_url = URI.parse(url) 
req = Net::HTTP::Get.new(parsed_url.path) 
res = Net::HTTP.start(parsed_url.host, parsed_url.port) {|http| 
    http.request(req) 
} 
+0

'Uri.parse'可能對此有所幫助。 http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/ – Brian 2011-05-11 23:11:49

+0

@Brian:奇怪的是,URL正在用'URI.parse'解析,但是當我沒有給出一個錯誤正確的URL。 – 2011-05-11 23:13:32

+1

是的,如果排除HTTP,URI.parse將爲您提供一個'URI :: Generic'對象而不是'URI :: HTTP'對象。 'URI :: Generic'類沒有'request_uri'方法,所以Net :: HTTP扼殺它。 – 2011-05-11 23:22:32

回答

1

這將做一個簡單的檢查,對HTTP/HTTPS:

if !(url =~ /^https?:/i) 
    url = "http://" + url 
end 

這可能是一個更普遍的一個處理多種協議(ftp等)

if !(url =~ /^\w:/i) 
    url = "http://" + url 
end 

爲了確保parsed_url.path給你一個適當的值(它應該是/當未提供具體的路徑),你可以做這樣的事情:

req = Net::HTTP::Get.new(parsed_url.path.empty? ? '/' : parsed_url.path) 
+0

這很好用。儘管如果URL需要它,我仍然有結尾斜槓的問題。 – 2011-05-11 23:17:25

+0

@Mark:我不認爲需要結尾斜槓(剛剛在Ruby 1.9的Net :: HTTP上進行了測試) – 2011-05-11 23:21:06

+0

每當我嘗試使用斜線時,都會出現以下錯誤:/Users/mark/.rvm/rubies /ruby-1.9.2-head/lib/ruby/1.9.1/net/http.rb:1660:in'initialize':來自/Users/mark/.rvm/rubies的HTTP請求路徑爲空(ArgumentError) \t /ruby-1.9.2-head/lib/ruby/1.9.1/net/http.rb:1779:in'initialize' \t from/Users/mark/Dropbox/prog/ruby​​/dl/lib/dl/dl .rb:9:'new' \t from /Users/mark/Dropbox/prog/ruby/dl/lib/dl/dl.rb:9:in'download' \t from ./dl:40:in'

' – 2011-05-11 23:23:57

2

如果這僅僅是做什麼的示例代碼顯示,開放式URI將是更簡單的方法

require 'open-uri' 
res = open(url).read 
+0

同意。一旦我開始使用它,我從不回頭。 – dimitarvp 2011-05-12 11:41:44

+0

有時候Net :: HTTP是必需的,因爲我們需要更好的控制,但99%的時間我使用open-uri。 – 2011-05-12 17:51:38

相關問題