我即将进行类似的卷曲调用:
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
,毕竟它似乎是一个正确的输出,但它并没有解决我的问题。
可能的解决方案是手动转换和替换每个字符,但有更好的解决方案吗?
答案 0 :(得分:2)
你想要
CGI.escape
代替。这可能会转换一个字符串,因此您可以将其作为html参数发送,例如:
CGI.escape "http://something that needs to be encoded"
=> "http%3A%2F%2Fsomething+that+needs+to+be+encoded"
答案 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"