Ruby で web にアクセスするなら simplehttp も良いと思います?

Rubyでwebにアクセスするならhttpclientが手軽 - http://rubikitch.com/に移転しました

というわけで、httpclient はとっても便利そうですね。これまで httpclient の存在を知らなかったので、とっても勉強になりました(るびきちさんはRubyのとっても便利な機能やライブラリをたくさん紹介して下さるのでとっても素晴らしい人だと思います!)。開発元はここでいいのかな?

http://dev.ctor.org/http-access2

しかし Ramaze な人であれば、やっぱり simplehttp の存在を忘れるわけにはいきません(Ramaze な人は spec を書くときにこっそり simplehttp のお世話になっています)。というわけで simplehttp も良いですよ!(と最初書いている時には思ったのですが、後で分かるようにPOSTリクエストの作成に問題があります)

http://simplehttp.rubyforge.org/

あまり多機能ではないのでクッキーやkeep-alive対応はありませんが、基本的な機能は httpclient と大体同じと思っても差し支えないだろうと思います。じゃあどういう風にいいの?と思うでしょうけれども、simplehttp は名前の通りとっても簡単です(httpclient も十分簡単だと思いますので、本当は好みとか気分とか、あとはこういう素敵なライブラリをさりげなく使っている Ramaze さんはとっても素敵なんですとか、そういう話です)。

インストールは gem ちゃって下さい。

sudo gem install simplehttp

ではるびきちさんの挙げられました例の真似事を simplehttp を使ってやってみます。

GET

簡単!

$KCODE="UTF-8"
require "rubygems"
require "simple_http"
require "kconv"

html = SimpleHTTP.get("http://www.google.co.jp/search", "q" => "ruby")
html.toutf8[/検索結果 約 <b>(.+?)<\/b> 件/, 1] # => "117,000,000"

POST

POSTだってとっても簡単ですね!

SimpleHttp.post "http://www.example.com/image_upload", { "key" => "value" }

いや、ただのデータを www-form-urlencoded で送るんじゃなくて、問題は multipart/form-data でファイルのポストがどうなのかですよね。一応ドキュメントに従うとこんな感じで書けと言っているようなのですが。

SimpleHttp.post "http://www.example.com/image_upload", File.read("image.png"), "img/png"

これで本当に大丈夫なの?と不安に思って調べてみたら、やはりダメではないでしょうか。以下に simplehttp 0.1.1 の post 部分を引用します。

        def post query=nil, content_type='application/x-www-form-urlencoded'
                req = Net::HTTP::Post.new(@uri.path)

                req.body= make_query query if query
                req.content_type=content_type if query
                req.content_length=query ? req.body.length : 0

                do_http req
        end

ということなので、内部で Net::HTTP::Post をつくってその content_type を単純に "img/png" に変更しているだけのようです。Net::HTTP::Post は勝手に multipart/form-data に変換してくれないと思うので、これはさすがにまずいのではないでしょうか。自前で multipart/form-data に変換して query として渡そうとしても、make_query というのが非常に邪魔になります。

結論としては現在のところ simplehttp はファイルのポストには向かないと思います。

まとめ

クッキー非対応だからさすがに代替というわけにはいかないけれども、その分コードが簡素でソースを読むのがとても楽で良いと思います。あとSimpleHttp::RESPONSE_HANDLERSというのがあってこれにレスポンスハンドラを定義出来たりして結構便利じゃないのかなと思います。ただし残念なことに require "base64" してるから 1.9 では動きません。

またPOSTの方には書いた通りの問題点がありますので、いずれとっても暇があったら直しておこうかな、と思います。名前の通りとびきりシンプルなのは間違いないので、その点できちんとした存在価値のあるライブラリだと思いますから、頑張って欲しいところです。あと Ramaze さんに取り込まれているから直しておかないとRamaze的に困ると言いますか、そんな身勝手な感じです。