WEBrickで遊んでみた
仕事でHTTP通信するプログラムを作ることになったんですが、ブラウザ以外でHTTP通信を送信する方法が分からなかったんで、Rubyでスクリプトを作ることにしました。
環境
- Mac OSX Lion 10.7.2
- Ruby 1.8.7
サーバスクリプト
#!/usr/bin/ruby require 'webrick' # サンプルサーブレット class ServletAction < WEBrick::HTTPServlet::AbstractServlet def do_POST (req, res) str = req.body.split("=") res.body = 'Your id is ' + str[1] end end # サーバ起動処理 srv = WEBrick::HTTPServer.new({ :DocumentRoot => './public', :BindAddress => '127.0.0.1', :CGIInterpreter => '/usr/bin/ruby', :Port => 9999}) srv.mount('/param', ServletAction) trap("INT"){ srv.shutdown } srv.start
Rubyで、サーバを扱うには、「WEBrick」というライブラリを使います。
インスタンスを生成して、プログラムを登録して、起動する。たった4行でサーバを構築することが出来ます。少し感動しました。
WEBrickは、ファイル、CGI、サーブレットなどを登録することが出来るみたいですが、今回はサーブレットを登録しました。サーブレットは、「WEBrick::HTTPServlet::AbstractServlet」を継承することで作成することができ、各通信メソッドごとに処理を記述します。
上記コードの場合、「http://localhost:9999/param」へPOSTメソッドを利用して通信することで、「ServletAction.do_POST」が実行されます。do_POSTメソッドの中は、JavaのHttpServletと同じように、HTTPリクエストオブジェクトとHTTPレスポンスオブジェクトを持ち、リクエストからパラメータを取得し、処理結果をレスポンスへ収めます。
クライアントスクリプト
require 'uri' require 'net/http' Net::HTTP.version_1_2 uri=URI('http://localhost:9999/param') Net::HTTP.start(uri.host, uri.port) { |http| header = { "user-agent" => "Ruby/#{RUBY_VERSION} SampleClient" } body = "id=1" response = http.post(uri.path, body, header) puts response.body }
クライアントは、「net/http」ライブラリを使います。今回は、サーバの「ServletAction」を実行させるために、「http://localhost:9999/param」をPOSTメソッドを利用して通信します。HTTPボディー部とヘッダー部にパラメータを設定し、通信を行うと、responseに通信結果が入っています。
実行結果
> ruby client.rb Your id is 1
まとめ
「WEBrick」と「net/http」を使うことで、HTTP通信を行うことが出来ました。これをJavaでやろうとすると、結構のボリュームになるだろうなぁ...手早く検証をしたい場合、WEBrickが有効だと感じました。