この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
railsプロジェクトで、外部サイトへデータをpostする時、パラメータの生成にhttpの「set_form_data」メソッドをお勧めします。railsプロジェクトで、外部サイトへデータをpostする時、パラメータの生成にhttpの「set_form_data」メソッドをお勧めします。
このメソッドをお勧めする理由は特殊文字(「&」、「” “」、「”/”」など)がパラメータの値に入る時、うまくエンコードできるのです。
例、
URI.encode⇒ “&”(&)
CGI.escape⇒” ”(+)
URI.escape ⇒ “&”(&)
ERB::Util.u(s)はうまくできると思います。
httpのset_form_dataの元ソースを見てみしょう。
/usr/local/lib/ruby/1.8/net/http.rb(rubyのインストールパスによりパスが変わる可能性がある)の
1432~ 1441行目前後
def set_form_data(params, sep = ‘&’)
self.body = params.map {|k,v| “#{urlencode(k.to_s)}=#{urlencode(v.to_s)}” }.join(sep)
self.content_type = ‘application/x-www-form-urlencoded’
end
def urlencode(str)
str.gsub(/[^a-zA-Z0-9_\.\-]/n) {|s| sprintf(‘%%%02x’, s[0]) }
end
使用方法は
98~ 109行目を確認
パラメータのキーと値をハッシュで渡せば、結構です。
#3: Detailed control
url = URI.parse(‘http://www.example.com/todo.cgi’)
req = Net::HTTP::Post.new(url.path)
req.basic_auth ‘jack’, ‘pass’
req.set_form_data({‘from’=>’2005-01-01’, ‘to’=>’2005-03-31’}, ‘;’)
res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
case res
when Net::HTTPSuccess, Net::HTTPRedirection
# OK
else
res.error!
end
よろしくお願いします。