Gzip压缩文件的JSON响应?

时间:2016-04-13 05:09:37

标签: ruby-on-rails ruby ruby-on-rails-4 heroku google-cloud-storage

有没有人有一个工作示例,从API端点获取gzip压缩响应并将其直接保存到文件中?

在写入文件之前解压缩非常大的API响应时,Heroku的内存存在问题。最好完全绕过解压缩,因为我想做的就是将响应视为给定并上传为文件到Google云端存储。

提前致谢!

编辑:我应该补充一点,数据只能通过POST获得,所以使用open-uri似乎不是一个选项。

1 个答案:

答案 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