我正在开发一个通过 RestClient 连接到后端数据存储(也是 ruby,而不是 rails)的 rails 应用程序。我刚刚将此方法添加到 rails 应用程序的后端 api 类,以从后端获取文件大小:
class Backend < ActiveResource::Base
def self.file_size(file_key)
RestClient.get("#{SERVER_URL}/files/#{file_key}/size")
end
end
而后端对应的代码是:
get '/files/:file_id/size' do
json_for file.size
end
对于一个示例文件,Backend.file_size(file.key) 返回“198942”,但是当这个属性被保存到数据库中时(在一个整数字段中),它被转换为 int 为 200。
我在rails控制台中玩过这个,输出令人困惑。
test_size = Backend.file_size(file.key)
=> "198942"
control_size = "198942"
=> "198942"
test_size.class
=> String
control_size.class
=> String
test_size.bytes.to_a
=> [49, 57, 56, 57, 52, 50]
control_size.bytes.to_a
=> [49, 57, 56, 57, 52, 50]
test_size.to_i
=> 200
control_size.to_i
=> 198942
Integer(test_size)
=> 198942
Integer(control_size)
=> 198942
test_size.to_s.to_i
=> 200
control_size.to_s.to_i
=> 198942
test_size.tr('^A-Za-z0-9', '').to_i
=> 198942
我还检查了编码,其余响应是 US-ASCII,但是当 force_encoded 为 UTF-8 时,它的行为是相同的。奇怪的是,test_size 在 Integer 和 tr sub 下正确转换以删除任何非打印字符,但字节内容与控制字符串相同。
我最终找到了这个问题的根源(在下面回答),但如果有人以前有过这种经验,以及是否有人能洞察为什么 RestClient 会以这种方式响应(在这种特殊情况下),我会很感兴趣。