【问题标题】:Ruby GET response body encoded?Ruby GET响应正文编码?
【发布时间】:2020-11-26 21:56:30
【问题描述】:

嘿,我正在尝试让 API 请求正常工作,但不知何故 Ruby GET 搞砸了。我在 docker 容器中运行应用程序,当我在容器内使用 curl 时,它返回正确的值。这是我的代码:

class StatisticsController < ApplicationController
  def index
    @group = Group.find(params[:statistic_group_id])
    @devices = @group.devices
    pids = @devices.map{|d| d.hwg['pid']}.uniq
    pid = {'pid' => pids}
    get(pid)
  end

  def get(params)

    require 'net/http' 
    require 'uri'

    password = "something"
    user =  "something"

    url = URI( "something").tap do |uri|
        uri.query = URI.encode_www_form(params)
    end
    https = Net::HTTP.start(url.host, url.port, use_ssl: url.scheme == 'https')
    request = Net::HTTP::Get.new(url, 'Content-Type' => 'application/json')
    request.basic_auth(user, password)
    response = https.request(request)
    @body = response.body
  end
end

"\u001F\x8B\b\u0000\u0000\u0000\u0000\u0000\u0000\u0003\x8A\x8E\u0005\u0000\u0000\u0000\xFF\xFF\u0003\u0000)\xBBL\r\ u0002\u0000\u0000\u0000" 这就是我得到的 response.body。响应头是200(所以应该没问题吧?)

这就是我应该得到的 [](空 json 数组)。该 url 似乎已成功创建(因为如果我一一执行命令,则从控制台粘贴它时它可以工作)。老实说,我不知道出了什么问题。

编辑: 问题在于 Ruby 默认编码覆盖了响应中发送的编码标头。这可以通过添加“Accept-Encoding”来解决

request = Net::HTTP::Get.new(url, 'Content-Type' => 'application/json', 'Accept-Encoding' => 'utf-8')

【问题讨论】:

  • 响应内容类型是什么?
  • response.body.encode('utf-8')
  • @snake 编码在这里实际上不起作用,因为它是由 Ruby 压缩的。
  • @Gowtham 响应类型与我期望的匹配。问题是默认的 Ruby 编码覆盖了响应中发送的编码头。

标签: ruby-on-rails ruby http-get


【解决方案1】:

在我看来,您的回复已被压缩。

【讨论】:

  • 谢谢,确实如此。我的同事帮助我找到了解决方案。问题是当请求中未指定任何内容时(即使响应中发送了 utf-8 标头),Ruby 会使用自己的编码(其中一部分是 gzip)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多