第一次使用法拉第,所以我可能做错了,但是下面的response.body
编码是 ASCII-8BIT:
def self.search(term)
connection = Faraday.new(url: 'https://en.wikipedia.org')
response = connection.get do |req|
req.options = { :timeout => 5, :open_timeout => 3 }
req.url '/w/api.php' , action: 'opensearch', format: 'xml', search: term
end
puts response.body.encoding
end
在 1.9.2 中,这会导致 REXML 抛出Encoding::CompatibilityError
。
我找不到强制法拉第在 UTF-8 中提供response.body
。
对此的首选解决方案是什么?
刚遇到同样的问题。 有任何想法吗?
我很确定法拉第只是从底层适配器传递响应主体。 我不确定是否要在法拉第中引发错误或对数据执行有损转换。 如果您确实需要,这可以在自定义中间件中完成。
很公平。 如果问题出在其他地方,正如它所显示的那样,我想它会及时清理。 对我来说,这不是表演的障碍。
关闭是因为这不是法拉第的错误。
我不确定底层适配器 - 至少是 net/http - 是否进行任何编码转换。 您可以将 Ruby 的 Encoding.default_external 设置为“US-ASCII”之类的内容,然后使用 Content-Type = '...; charset=utf-8' ... net/http 将解析字符集字符串并使其可用,但对正文字符串的编码没有任何作用。 也许 net/http 应该对此负责,但如果不是,ParseJson 中间件(例如)可能会爆炸。
对此进行了更多研究 - 一些底层适配器处理 Content-Type 字符集,有些不处理:
EM-HTTP-Request确实如此。 [提交]。
赞助人。 [提交]。
HTTPClient 确实 [[commit](https://github.com/nahi/httpclient/commit/e5efea5afb3b5cf6ead3a131644dee71be1ee5e9)] [[issue](https://github.com/nahi/httpclient/issues/26)]。
Typhoeus 和 Excon(和 net/http)似乎没有。
我想最好的办法可能是为不尝试的适配器提供一个可选的中间件,但是,是的,我同意,这可能不应该是法拉第的责任。
@chrismo你是我的英雄。 感谢您进行这项研究!
最有用的评论
我使用的解决方法是:
亚胡达有一个关于这个问题论文这里。