Faraday: 当 Content-Type 为 text/xml 时,response.body 为 ASCII-8BIT; 字符集=utf-8

创建于 2012-04-16  ·  9评论  ·  资料来源: lostisland/faraday

第一次使用法拉第,所以我可能做错了,但是下面的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

对此的首选解决方案是什么?

最有用的评论

我使用的解决方法是:

response.body.force_encoding('utf-8')

亚胡达有一个关于这个问题论文这里

所有9条评论

刚遇到同样的问题。 有任何想法吗?

我使用的解决方法是:

response.body.force_encoding('utf-8')

亚胡达有一个关于这个问题论文这里

我很确定法拉第只是从底层适配器传递响应主体。 我不确定是否要在法拉第中引发错误或对数据执行有损转换。 如果您确实需要,这可以在自定义中间件中完成。

很公平。 如果问题出在其他地方,正如它所显示的那样,我想它会及时清理。 对我来说,这不是表演的障碍。

关闭是因为这不是法拉第的错误。

我不确定底层适配器 - 至少是 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你是我的英雄。 感谢您进行这项研究!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

luizkowalski picture luizkowalski  ·  3评论

iMacTia picture iMacTia  ·  3评论

yykamei picture yykamei  ·  4评论

yusefu picture yusefu  ·  3评论

jeffb-stell picture jeffb-stell  ·  5评论