2016-03-06 135 views
1

我即将做类似的卷曲调用是这样的:如何将空格转换为http url的加号(+)字符?

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

它为什么重要?就mapbox.com而言,“pancakes + house”和“pancakes%20house”应该完全相同。 –

回答

0

一个简单的方法是使用String#gsub,但我建议为文件名的操作/地址不仅没有对整个网址:

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

你想

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

打破了问题:

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

我建议你也看看Addressable::URI。这是一个非常全面的处理URI的gem。

相关问题