URI.parse不想用|解析uri (管)char

时间:2014-12-10 20:36:23

标签: ruby

我正在尝试发送获取请求:

require "net/https"
require "uri"

...

uri = "https://graph.facebook.com/v2.2/#{event_id}?access_token=#{access_token}"                                                                                                                                                                                                 
uri = URI.parse(uri)                                                                                                                                                                                                                                                             
http = Net::HTTP.new(uri.host, uri.port)                                                                                                                                                                                                                                         
http.use_ssl = true                                                                                                                                                                                                                                                              
http.verify_mode = OpenSSL::SSL::VERIFY_NONE                                                                                                                                                                                                                                     

request = Net::HTTP::Get.new(uri.request_uri)                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                     response = http.request(request)                                                                                                                                                                                                                                                 
response.body                                       

Facebook向我发送acces_token|个字符,因此uri = URI.parse(uri)会抛出错误:URI::InvalidURIError: bad URI(is not URI?) https:/ ....

是否有其他解析器,还是应该手动提取这些host,port,request_uri值?修复它的最佳方法是什么?

access_token看起来像141112112181111|9Alz3xW7P0CQ_DRomJN2oMeiwXs

event_id例如385101904985590

编辑:刚刚意识到它的结构是APP_ID|some_token

2 个答案:

答案 0 :(得分:4)

您是否尝试使用URI#encode编码URI?

uri = 'http://foobar.com?foo=something|weird'    
uri = URI.encode(uri)
uri = URI.parse(uri) => #<URI::HTTP:0x007fe2f48775b0 URL:http://foobar.com?foo=something%7Cweird>

答案 1 :(得分:0)

不要尝试将变量注入URI查询参数,尤其是令牌和密钥,以及这样做是创建无效参数的好途径。相反,依赖URI类并让它尽可能地处理。

require 'uri'

event_id = 1
access_token = 'foo|bar'

uri = URI.parse("https://graph.facebook.com/v2.2/#{event_id}")
uri.query = URI.encode_www_form(['access_token', access_token])
uri.to_s # => "https://graph.facebook.com/v2.2/1?access_token&foo%7Cbar"

如果你想要更全功能的东西,Addressable::URI非常好。

参见&#34; Parsing string to add to URL-encoded URL&#34;了解更多信息。