纯Ruby可用但Rails中使用google-api-client报非gzip格式错误
解决Rails中google-api-client报“not in gzip format”的问题
我之前也碰到过一模一样的情况——纯Ruby脚本跑Google API顺得很,一放到Rails项目里就炸锅,核心原因大多是Rails环境下的HTTP客户端配置和纯Ruby环境不一致,导致gzip压缩的处理逻辑冲突了。下面给你几个实用的排查和解决方向:
1. 禁用google-api-client的自动gzip解压
google-api-client默认用Faraday处理HTTP请求,并且自动启用了gzip解压。但如果Rails里的中间件或日志gem(比如你日志里出现的httplog)提前读取并处理了响应的gzip流,就会导致客户端二次解压时触发格式错误。
你可以在初始化DriveService时,手动配置Faraday禁用gzip处理:
drive_service = Google::Apis::DriveV2::DriveService.new drive_service.authorization = your_authorization_object # 替换成你的授权实例 # 自定义HTTP客户端配置,移除默认的gzip中间件 drive_service.http_client do |faraday| faraday.builder.delete(FaradayMiddleware::Gzip) # 或者直接设置不解压:faraday.use FaradayMiddleware::Gzip, decompress: false end
2. 排查httplog等日志gem的干扰
从你的调试日志能看到[httplog]的输出,这个gem在记录请求响应时,可能会提前读取响应体,破坏了原始的gzip二进制流格式。
你可以先临时禁用httplog测试:
# 在执行Google API请求前临时关闭日志 HttpLog.enabled = false # 执行你的文件列表请求 files = drive_service.list_files(q: "'root' in parents", spaces: 'drive', fields: 'nextPageToken, items(*)') # 之后按需恢复日志 HttpLog.enabled = true
如果禁用后错误消失,就调整httplog的配置,跳过Google API的响应体记录:
# 在config/initializers/httplog.rb中添加 HttpLog.skip_body do |env| env.url.start_with?('https://www.googleapis.com') end
3. 强制请求未压缩的响应
如果上面的方法都没效果,你可以直接告诉Google API不要返回gzip压缩的内容:
drive_service.request_options.update(headers: { 'Accept-Encoding' => 'identity' })
这样API会返回未压缩的响应,自然就不会触发gzip格式错误了。
4. 检查Faraday版本差异
有时候Rails项目里的Faraday版本和纯Ruby环境不一致,导致默认行为不同。你可以对比两边的bundle show faraday输出,若版本有差异,尝试统一版本或针对性调整配置。
内容的提问来源于stack exchange,提问作者Maris
相关产品推荐
相关产品推荐

