用法拉第编码_www_form_component的问题。

问题描述 投票:0回答:1

目前,我正在重写一整个应用程序,从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

Hoewever,我得到了这个。

reusable_image

我在SO中搜索了这个问题的解决方法 我发现了这个 -> URI::InvalidURIError (bad URI(is not URI?): ):

但这又让我回到了使用 URI.encode 我想避免的。

有什么解决办法吗,还是说我应该暂时忽略这个过时的警告,直到有更好的东西出现?

ruby-on-rails ruby uri
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.