Hatena::ブログ(Diary)

urekatのスカンク日記3 このページをアンテナに追加 RSSフィード

2007-02-01

[]open-uriをPOST対応させる

http://lingr.g.hatena.ne.jp/urekat/

http://ssktkr.com/lingrjs/

JavaScriptLingrクライアントを作る過程でおもろいのができた。

open-uri-post.rb

require "open-uri"
require "net/http"

module Net
  class HTTPRequest
    self.class_eval{
      attr_reader :postdata
      def initialize(path, initheader = nil)
        klass = initheader["postdata"] ? HTTP::Post : HTTP::Get if initheader
        @postdata = initheader.delete("postdata")
        super klass::METHOD,
              klass::REQUEST_HAS_BODY,
              klass::RESPONSE_HAS_BODY,
              path, initheader
      end
    }
  end
  class HTTP
    self.class_eval{
      alias :_request :request
      def request(req, body = nil, &block)
        body = req.postdata if req.respond_to?(:postdata)
        _request(req, body, &block)
      end
    }
  end
end

こいつをopen-uriの代わりにrequireしてやれば

open("http://localhost:3000/test", {"postdata"=>"a=5&b=6"}){|f|
  p f.read
}

これだけでPOSTできる!便利!!

http://d.hatena.ne.jp/tarte/20061129

http://lingr.g.hatena.ne.jp/Psychs/

http://svn.lingr.com/api/toolkits/ruby/infoteria/

Connection: close