Ruby 相当于Rack::Utils.build_查询,该查询使用%20(而不是+;)作为空间

Ruby 相当于Rack::Utils.build_查询,该查询使用%20(而不是+;)作为空间,ruby,Ruby,我正在寻找一个将哈希转换为查询字符串的函数。我知道Rack::Utils.build\u query,但它使用+作为空格。build\u query使用Rack::Utils.escape,它用+字符替换空格。您可以添加一个版本的build\u query,该版本使用Rack::Utils.escape\u path,例如 module Rack::Utils def your_build_query(params) params.map { |k, v| if v.cl

我正在寻找一个将哈希转换为查询字符串的函数。我知道
Rack::Utils.build\u query
,但它使用
+
作为空格。

build\u query
使用
Rack::Utils.escape
,它用+字符替换空格。您可以添加一个版本的build\u query,该版本使用
Rack::Utils.escape\u path
,例如

module Rack::Utils
  def your_build_query(params)
    params.map { |k, v|
      if v.class == Array
        build_query(v.map { |x| [k, x] })
      else
        v.nil? ? escape_path(k) : "#{escape_path(k)}=#{escape_path(v)}"
      end
    }.join("&")
  end
end
但是
escape\u路径所做的一切都是
escape.gsub('+','%20')
,所以您可以调用
Rack::Utils.build\u query.gsub('+','%20')
,您看过了吗?它内置于Ruby中

从文件中:

URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => "ruby", "lang" => "en")
#=> "q=ruby&lang=en"
URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
#=> "q=ruby&q=perl&lang=en"
URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
#=> "q=ruby&q=perl&lang=en"

关于使用
%20
+
的问题,请参见“

为什么使用
+
%20
有关系?在解码时,它们应该被解释为相同的东西。考虑一个api端点,它要求您根据查询字符串计算签名。在这种情况下,您不需要解析URL,对其进行标准化(以便
?a=b&c=d
?c=d&a=b
的结果确实是相同的),然后将其重新组合起来吗?然后你的“把它放回一起”步骤将标准化空间的
+
%20
。它确实有效,但本质上是
str.gsub(“,”+).gsub(“+”,“%20”)
,这并不理想。
URI.encode www\u form
Rack::Utils.build\u query
没有什么不同。此方法不转换*、-、、0-9、A-Z、Z、A-Z,但将SP(ASCII空格)转换为+并将其他转换为%XX