You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纯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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:31:12