encode_www_form_component 法拉第的问题
encode_www_form_component problem with Faraday
目前我正在重写整个应用程序,从 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
is obsolete 警告。
为了摆脱它,我重写了整个部分,如下所示:
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?): ):
但这又是 returns 我要使用 URI.encode
我想避免的。
对此有任何解决方案,还是我现在应该静静地忽略过时的警告,直到出现更好的东西?
试试这个:
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
目前我正在重写整个应用程序,从 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
is obsolete 警告。
为了摆脱它,我重写了整个部分,如下所示:
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?): ):
但这又是 returns 我要使用 URI.encode
我想避免的。
对此有任何解决方案,还是我现在应该静静地忽略过时的警告,直到出现更好的东西?
试试这个:
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