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