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

curl返回JSON但Ruby的rest-client返回gzip的原因及解决方法

问题解答:curl自动解压gzip及Ruby rest-client处理gzip响应

curl是否自动解压gzip?

是的,curl默认会自动处理gzip压缩的响应。当你执行curl命令时,它会自动在请求头里加上Accept-Encoding: gzip, deflate,告知服务器可以返回压缩后的内容;如果服务器返回带有Content-Encoding: gzip的响应,curl会在输出到终端前自动完成解压,所以你看到的是正常的JSON格式数据。

让rest-client返回JSON或自动解压gzip的方法

方法1:手动添加请求头并解压响应

先给请求加上Accept-Encoding头,然后通过Ruby的Zlib库手动解压响应内容,再解析成JSON:

require 'rest-client'
require 'zlib'
require 'stringio'
require 'json'

supabase_key = "你的SUPABASE_KEY"
url = 'myproject/rest/v1/events?select=*'

response = RestClient.get(url, {
  apikey: supabase_key,
  Authorization: "Bearer #{supabase_key}",
  'Accept-Encoding' => 'gzip, deflate'
})

# 判断响应是否为gzip压缩格式
if response.headers[:content_encoding] == 'gzip'
  uncompressed_body = Zlib::GzipReader.new(StringIO.new(response.body)).read
else
  uncompressed_body = response.body
end

# 解析为JSON对象
json_data = JSON.parse(uncompressed_body)

方法2:利用rest-client中间件自动处理

rest-client支持通过中间件自动完成gzip的请求头添加和解压操作,只需启用对应的中间件即可:

require 'rest-client'
require 'rest-client/components'
require 'json'

# 启用gzip处理中间件
RestClient.enable Rack::Deflater
RestClient.enable RestClient::Middleware::Gzip

supabase_key = "你的SUPABASE_KEY"
url = 'myproject/rest/v1/events?select=*'

response = RestClient.get(url, {
  apikey: supabase_key,
  Authorization: "Bearer #{supabase_key}"
})

# 此时response.body已经是解压后的文本,直接解析JSON
json_data = JSON.parse(response.body)

另外提一句,如果你用net/http遇到同样问题,处理逻辑和方法1类似:发送请求时带上Accept-Encoding头,收到响应后判断是否为gzip格式,再用Zlib解压后解析JSON。

内容的提问来源于stack exchange,提问作者ultimatenoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:15:45