有没有人有一个工作示例,从API端点获取gzip压缩响应并将其直接保存到文件中?
在写入文件之前解压缩非常大的API响应时,Heroku的内存存在问题。最好完全绕过解压缩,因为我想做的就是将响应视为给定并上传为文件到Google云端存储。
提前致谢!
编辑:我应该补充一点,数据只能通过POST获得,所以使用open-uri似乎不是一个选项。
答案 0 :(得分:0)
以下显示了使用" Accept-Encoding"时实际发生的情况。并将其设置为gzip。如果将accept标头设置为gzip,则响应的主体是实际的压缩数据,您可以将其传递给gunzip
,示例如下。
我从这里得到了这个......
https://gist.github.com/joho/3747653
当你运行它时,像这样运行
ruby http_gzip.rb | gunzip -c
这将下载gzip压缩的Google搜索结果...
require 'net/http'
debug = Proc.new{|msg| STDERR.puts "[#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}] #{msg}" }
page = nil
http = Net::HTTP.new( "www.google.com", 80 )
req = Net::HTTP::Get.new( "/search?num=20&hl=en&noj=1&q=accept-encoding&btnG=Search", { "Accept-Encoding" => "gzip", "User-Agent" => "gzip" } )debug.call( "Performing HTTP GET request for (#{req.path})." )
res = http.request( req )
debug.call( "Received HTTP Response Code (#{res.code})" )
case res
when Net::HTTPSuccess then
begin
if res.header[ 'Content-Encoding' ].eql?( 'gzip' ) then
debug.call( "Performing gzip decompression for response body." )
#sio = StringIO.new( res.body )
#gz = Zlib::GzipReader.new( sio )
#page = gz.read()
page = res.body
debug.call( "Finished decompressing gzipped response body." )
else
debug.call( "Page is not compressed. Using text response body. " )
page = res.body
end
rescue Exception
debug.call( "Error occurred (#{$!.message})" )
# handle errors
raise $!.message
end
end
puts page