2016-03-06 45 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。

相關問題