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
相关产品推荐
相关产品推荐

