【发布时间】: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