如何将空格转换为http url的加号(+)字符?

时间:2016-03-06 18:13:36

标签: ruby-on-rails ruby curl

我即将进行类似的卷曲调用:

curl https://api.mapbox.com/geocoding/v5/mapbox.places/1600+pennsylvania+ave+nw.json

当我输入自己的地址时,它看起来像这样:1600 pennsylvania ave nw。我尝试使用+方法将空格转换为URI.encode个字符:

address = URI.encode(full_address)

但结果是1600%20pennsylvania%20ave%20nw,毕竟它似乎是一个正确的输出,但它并没有解决我的问题。

可能的解决方案是手动转换和替换每个字符,但有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

你想要

CGI.escape

代替。这可能会转换一个字符串,因此您可以将其作为html参数发送,例如:

CGI.escape "http://something that needs to be encoded"
=> "http%3A%2F%2Fsomething+that+needs+to+be+encoded"

另见What's the difference between URI.escape and CGI.escape?

答案 1 :(得分:1)

解决问题:

require 'uri'

path, filename = File.split('/geocoding/v5/mapbox.places/1600 pennsylvania ave nw.json')

URI路径是资源的文件路径,因此您可以使用File.split来获取路径和文件名。

uri = URI.parse('https://api.mapbox.com')
uri.path = [path, URI.encode_www_form_component(filename)].join('/')

从路径和编码的文件名重建URI的路径,它为您提供:

uri.to_s
# => "https://api.mapbox.com/geocoding/v5/mapbox.places/1600+pennsylvania+ave+nw.json"

在我看来,使用%20应该是在路径中编码空格的正确方法,但这将取决于他们如何编写代码。

如果您只处理将空格转换为gsub,则可以使用+,但如果存在需要的其他字符,则会错过必要的编码。 URI遵循RFC,gsub除非您编写了更多代码,否则for(j=0;j++;j<VALUES)不会。

我建议同时查看Addressable::URI。它是处理URI的功能非常全面的宝石。

答案 2 :(得分:0)

一种简单的方法是使用String#gsub,但我建议只对文件名/您的地址执行此操作,而不是针对整个网址:

"1600 pennsylvania   ave     nw.json".squeeze(" ").gsub(" ", "+")
# => "1600+pennsylvania+ave+nw.json"