我正在尝试发送获取请求:
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
答案 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;了解更多信息。