我正在尝试使用Net::HTTP
向特定网站发出POST请求,并在返回响应后开始下载文件。
我首先使用wget对此进行了测试,并且它工作正常。我也尝试使用httpi
和unirest
宝石,它很顺利。但是,因为Net::HTTP
是低级API而我需要更多控制(例如,跟踪下载进度),所以我会坚持下去。
问题是,下载只是没有开始。所以这里是代码:
require 'net/http'
require 'tempfile'
uri = URI.parse("http://mywebsite.com")
req = Net::HTTP::Post.new(uri.path)
req.set_form_data({'filed' => 'data'})
response = Net::HTTP.start(uri.hostname, uri.port) {|http|
http.request(req) do |response|
temp_file = Tempfile.new("new_file")
response.read_body do |chunk|
temp_file << chunk
end
end
}
我认为问题必须得到回应,我得到的不是Net::HTTPOK
但HTTPSeeOther
以及此处有关于它的更多信息
#<Net::HTTPSeeOther:0x91f2670>
{"server"=>["nginx"], "date"=>["Sat, 21 Dec 2013 22:32:14 GMT"],
"content-type"=>["text/html"], "transfer-encoding"=>["chunked"],
"connection"=>["keep-alive"], "pragma"=>["no-cache"],
"cache-control"=>["no-cache, must-revalidate"],
"expires"=>["Sat, 26 Jul 1997 05:00:00 GMT"],
"location"=>["http://mywebsite.com/path/to/file.rar"]}
我提到的其他2个宝石知道如何自动开始下载,我不知道如何处理HTTPSeeOther。
答案 0 :(得分:0)
您似乎从服务器获得了重定向响应,wget
,curl
和高级库将自动跟随。使用Net::HTTP
,您需要向该位置发起新的GET
请求。