如何将空格转换为http url的加号(+)字符?
问题描述:
我即将做类似的卷曲调用是这样的:如何将空格转换为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
,这毕竟,似乎是一个正确的输出,但它并没有解决我的问题。
作为一个可能的解决方案是手动转换和替换每个字符,但有没有更好的解决方案?
答
一个简单的方法是使用String#gsub,但我建议为文件名的操作/地址不仅没有对整个网址:
"1600 pennsylvania ave nw.json".squeeze(" ").gsub(" ", "+")
# => "1600+pennsylvania+ave+nw.json"
答
你想
CGI.escape
代替。这可能将字符串转换,所以你可以把它作为一个HTML参数,例如:
CGI.escape "http://something that needs to be encoded"
=> "http%3A%2F%2Fsomething+that+needs+to+be+encoded"
答
打破了问题:
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。
它为什么重要?就mapbox.com而言,“pancakes + house”和“pancakes%20house”应该完全相同。 –