-1

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]

助けていただければ幸いです...

4

1 に答える 1

0

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

補間を使用して URL に値を挿入できる場合は 90% の確率で機能しますが、エンコードする必要がある文字を含める必要がある場合があり、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 の未定義のメソッド `decode_www_form' (NoMethodError)

ルビー1.9を使用しています

Addressable gemを見てください。これは非常にうまくできており、組み込みの 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
于 2013-06-09T06:15:08.817 に答える