「ひとかじりのりんご」

へっぽこエンジニアの備忘録。こちらは旧ブログ。新しい方はこちら→「http://sbkro.github.io」

WEBrickで遊んでみた

仕事でHTTP通信するプログラムを作ることになったんですが、ブラウザ以外でHTTP通信を送信する方法が分からなかったんで、Rubyでスクリプトを作ることにしました。

環境

サーバスクリプト

#!/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が有効だと感じました。