【问题标题】:URI::InvalidURIError when parsing arguments to URL [closed]将参数解析为 URL 时出现 URI::InvalidURIError [关闭]
【发布时间】:2013-06-05 02:05:45
【问题描述】:

https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=#{user}&count=#{number} (URI::InvalidURIError)

我从命令行解析的参数是

name = ARGV[1]
number = ARGV[2]

希望能得到一些帮助...

【问题讨论】:

    标签: ruby twitter gem


    【解决方案1】:

    与其尝试将值插入 URL,不如做正确的事,让 Ruby 处理可能的特殊字符编码:

    require 'uri'
    
    name = 'foo'
    number = 1
    
    uri = URI('https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true')
    uri.query = URI.encode_www_form(
      Hash[
        URI.decode_www_form(uri.query)
      ].merge('name' => name, 'count' => number)
    )
    
    puts uri
    

    运行后,输出如下:

    https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&name=foo&count=1
    

    虽然您可以在 90% 的情况下使用插值将值放入 URL,但有时您需要包含需要编码的字符,并且当您使用插值时,您的 URL 会生成错误尝试使用它。

    URI 类遵循查询编码方式的规范,因此您不会遇到这些问题。

    分解它,你可以看到会发生什么:

    uri.query
    # => "include_entities=true&include_rts=true"
    URI.decode_www_form(uri.query)
    # => [["include_entities", "true"], ["include_rts", "true"]]
    Hash[URI.decode_www_form(uri.query)]
    # => {"include_entities"=>"true", "include_rts"=>"true"}
    Hash[URI.decode_www_form(uri.query)].merge('name' => name, 'count' => number)
    # => {"include_entities"=>"true", "include_rts"=>"true", "name"=>"foo", "count"=>1}
    URI.encode_www_form(Hash[URI.decode_www_form(uri.query)].merge('name' => name, 'count' => number))
    # => "include_entities=true&include_rts=true&name=foo&count=1"
    

    编辑:

    URI:Module (NoMethodError) 的未定义方法 `decode_www_form'

    我使用 ruby​​ 1.9

    查看Addressable 宝石。它做得非常好,并且比内置的 URI 类具有更多功能:

    require 'addressable/uri'
    
    name = 'foo'
    number = 1
    
    uri = Addressable::URI.parse('https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true')
    uri.query_values = uri.query_values.merge('name' => name, 'count' => number)
    
    puts uri
    

    看起来像:

    https://api.twitter.com/1/statuses/user_timeline.json?count=1&include_entities=true&include_rts=true&name=foo
    

    【讨论】:

    • 所以我认为这将适用于参数...
    • URI:Module (NoMethodError) 的未定义方法“decode_www_form”
    • decode_www_form是URI的类方法,一直是since Ruby 1.9.2。您正在运行 1.9.2 之前的 Ruby 版本吗?如果没有,你没有正确实现代码示例。
    • 然后查看 Addressable gem。请参阅我的答案中添加的示例。
    • run ruby​​ -v get 1.8...so ill intsall 1.9..希望它能工作...
    猜你喜欢
    • 2012-02-09
    • 2016-09-23
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2013-04-09
    • 2014-02-17
    相关资源
    最近更新 更多