如何在Ruby中生成含%20编码的URI
嘿,这个需求我之前做项目的时候也遇到过,给你两个简便的解决方案,不用绕弯路:
方案一:手动用CGI.escape构建查询参数
CGI.escape会把空格编码成%20,刚好符合你的需求。我们可以遍历哈希的键值对,分别编码后再拼接成查询字符串:
query_params = { name: 'john doe' }.map do |key, value| "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}" end.join('&') u = URI::HTTP.build(host: 'www.google.com', query: query_params) u.to_s # 输出:http://www.google.com?name=john%20doe
这种方法完全避开了to_query的+编码逻辑,直接生成符合要求的格式。
方案二:基于to_query替换编码字符
如果你还是想保留to_query的便捷性(比如处理复杂哈希、嵌套参数的场景),可以在生成查询字符串后,把+替换成%20——这个操作很安全,因为to_query生成的+本质上就是空格的编码,不会和其他字符冲突:
query_string = { name: 'john doe' }.to_query.gsub('+', '%20') u = URI::HTTP.build(host: 'www.google.com', query: query_string) u.to_s # 输出:http://www.google.com?name=john%20doe
顺便说下为什么to_query会生成+:Rails的Hash#to_query底层用的是URI.encode_www_form,遵循的是application/x-www-form-urlencoded标准,这个标准里空格既可以用+也可以用%20,Rails默认选了+而已。
内容的提问来源于stack exchange,提问作者Jon Snow
相关产品推荐
相关产品推荐

