その他
    ホーム 技術発信 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

    よろしくお願いします。

    記事を共有