ホーム DoRuby Rails、外部サイトへPOSTする時、データ生成

Rails、外部サイトへPOSTする時、データ生成

この記事はアピリッツの技術ブログ「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

よろしくお願いします。

記事を共有

最近人気な記事