【问题标题】:encode_www_form_component problem with Faraday法拉第的 encode_www_form_component 问题
【发布时间】:2020-05-04 12:47:04
【问题描述】:

目前我正在将整个应用程序从 Rails 3 重写为 Rails 6。

在这个过程中,我还清理了很多东西。

但这是我的问题。

我有一个名为Reusable 的模块,顾名思义,它包含大量跨模型的可重用方法。

我们使用Faraday 建立到某个服务器的连接:

旧代码如下所示:

module Reusable
  def self.establish_connection(url)
    url = I18n.transliterate(url)
    url = URI.encode(url)
    conn = Faraday.new(url: url) do |builder|
      builder.use :cookie_jar
      builder.use FaradayMiddleware::FollowRedirects
      builder.adapter Faraday.default_adapter
    end
    conn.get
    conn
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Errno::ETIMEDOUT => e
    message = "(Timeout::Error) Connection to address: #{url} failed. If address is reachable please run the method again."
  end
end

但是,通过迁移到 Ruby 2.7.0,我们收到了可怕的 URI.encode 已过时警告。

为了摆脱它,我像这样重写了整个部分:

module Reusable
  def self.establish_connection(url)
    url = I18n.transliterate(url)
    url = URI.encode_www_form_component(url)

    conn = Faraday.new(url: url) do |builder|
      builder.request :url_encoded
      builder.use :cookie_jar
      builder.use FaradayMiddleware::FollowRedirects
      builder.adapter Faraday.default_adapter
    end
    conn.get
    conn
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Errno::ETIMEDOUT => e
    message = "(Timeout::Error) Connection to address: #{url} failed. If address is reachable please run the method again."
  end
end

不过,我明白了:

我在 SO 中搜索了这个问题的解决方案,我找到了这个 -> URI::InvalidURIError (bad URI(is not URI?): ):

但这又让我重新使用我想避免的URI.encode

对此有任何解决方案,还是我应该暂时忽略过时的警告,直到出现更好的情况?

【问题讨论】:

  • 您能否添加一个在旧版本中确实引发错误但在新版本中失败的 URL 示例?
  • 是的。 joyn.de
  • 表单/查询参数应该传入encode_www_form_component而不是url
  • @kiddorails 问题是我们从前端接收 URL。之后,它首先在控制器函数中呈现为后端的字符串,然后我们使用此方法。但是考虑到您提到的用法,这可能是一个很好的策略,删除了在控制器中转换为 String 的中间步骤,并且直接将表单参数与模块函数一起使用。谢谢你的提示。我会试试的。

标签: ruby-on-rails ruby uri


【解决方案1】:

试试这个:

module Reusable
  def self.establish_connection(url)
    url = I18n.transliterate(url)
    params = Rack::Utils.parse_nested_query(URI(url).query)

    conn = Faraday.new(url: url, params: params) do |builder|
      builder.request :url_encoded
      builder.use :cookie_jar
      builder.use FaradayMiddleware::FollowRedirects
      builder.adapter Faraday.default_adapter
    end
    conn.get
    conn
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Errno::ETIMEDOUT => e
    message = "(Timeout::Error) Connection to address: #{url} failed. If address is reachable please run the method again."
  end
end

【讨论】:

    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2011-12-27
    • 2014-05-28
    相关资源
    最近更新 更多