18

OpenURI を使用する前に URL をエンコードまたは「エスケープ」するにはどうすればよいopen(url)ですか?

OpenURI を使用してリモート URL を開き、xml を返します。

getresult = open(url).read

問題は、URL にスペースやその他の文字 ("+"、"&"、"?" など) を含むユーザー入力テキストが含まれている可能性があるため、URL を安全にエスケープする必要があることです。Net::HTTP の使用例はたくさん見ましたが、OpenURI の例は見つかりませんでした。

また、セッション変数で受け取った同様の文字列をエスケープ解除できる必要があるため、逆数関数が必要です。

4

4 に答える 4

32

URI.escape1.9 で廃止されたため、使用しないでください。

Rails のアクティブ サポートには次のものが追加されますHash#to_query

 {foo: 'asd asdf', bar: '"<#$dfs'}.to_query
 # => "bar=%22%3C%23%24dfs&foo=asd+asdf"

また、ご覧のとおり、クエリ パラメータを常に同じ方法で並べ替えようとします。これは、HTTP キャッシュに適しています。

于 2012-11-29T13:06:14.560 に答える
14

救助へのRuby標準ライブラリ:

require 'uri'
user_text = URI.escape(user_text)
url = "http://example.com/#{user_text}"
result = open(url).read

詳しくは、URI::Escape モジュールのドキュメントを参照してください。また、逆を行うメソッドもあります ( unescape)

于 2011-02-11T10:17:57.287 に答える
8

考慮しなければならない主なことは、完全なURLを作成する前に、キーと値を別々にエスケープする必要があるということです。

完全なURLを取得し、後でそれをエスケープしようとするすべてのメソッドは壊れています。これは、いずれ&=の文字が区切り文字であるか、値の一部(またはキーの一部)であるかを判断できないためです。

CGIライブラリは、従来はとしてエンコードされていたスペース文字を除いて、うまく機能しているようです。+現在は、としてエンコードする必要があります%20。しかし、これは簡単な修正です。

次の点を考慮してください。

require 'cgi'

def encode_component(s)
  # The space-encoding is a problem:
  CGI.escape(s).gsub('+','%20')
end

def url_with_params(path, args = {})
  return path if args.empty?
  path + "?" + args.map do |k,v|
    "#{encode_component(k.to_s)}=#{encode_component(v.to_s)}" 
  end.join("&")
end

def params_from_url(url)
  path,query = url.split('?',2)
  return [path,{}] unless query
  q = query.split('&').inject({}) do |memo,p|
    k,v = p.split('=',2)
    memo[CGI.unescape(k)] = CGI.unescape(v)
    memo
  end
  return [path, q]
end

u = url_with_params( "http://example.com",
                            "x[1]"  => "& ?=/",
                            "2+2=4" => "true" )

# "http://example.com?x%5B1%5D=%26%20%3F%3D%2F&2%2B2%3D4=true"

params_from_url(u)
# ["http://example.com", {"x[1]"=>"& ?=/", "2+2=4"=>"true"}]
于 2011-12-08T16:28:27.737 に答える
2

Rubyには組み込みのURIライブラリがあり、Addressable gem、特にAddressable::URIがあります。

私はAddressable::URIを好みます。それは非常にフル機能であり、メソッドを使用するときにエンコーディングを処理しますquery_values=

URIについていくつかの議論が増えているのを見てきたので、これらが整理されるまで、エンコード/エスケープを処理するためにURIをそのままにしておく傾向があります。

于 2011-02-11T13:35:04.720 に答える