WEBrickで人工無脳WebAPIを書いてみた。
人工無脳「Sixamo」が応答するWebAPIサーバをWEBrickで書いてみました。
WEBrickで書かれたししゃもAPIサーバの生コードです。
#!ruby -Ku # Sixamo Simple WebAPI Servlet # # Setting # ruby sixamo.rb --init dict_path # # Running # ruby sixamo_api.rb # # Sixamo talk API(Only Charcode='UTF-8') # GET http://localhost:10080/sixamo.xml #=> SixamoAPI for XML # GET http://localhost:10080/sixamo.json #=> SixamoAPI for Json # params {'text' => String} optional # # Sixamo memorize API # POST http://localhost:10080/sixamo.xml #=> SixamoAPI for XML # POST http://localhost:10080/sixamo.json #=> SixamoAPI for Json # params {'text' => String} # require 'webrick' require 'sixamo' require 'kconv' dict = 'sixamo' $sixamo = Sixamo.new(dict) srv = WEBrick::HTTPServer.new({:BindAddress => '0.0.0.0', :Port => 10080}) def message_to_xml(message) doc = <<EOF <?xml version="1.0" encoding="UTF-8"?> <message>#{message}</message> EOF end def message_to_json(message) doc = <<EOF { message: "#{message}" } EOF end class SixamoServlet < WEBrick::HTTPServlet::AbstractServlet def do_POST(req, res) message = nil if req.query.key?('text') if req.query['text'].isutf8 $sixamo.memorize(req.query['text']) res.status = 201 message = "memorize omplete." else res.status = 403 message = "Input text-charcode is only 'UTF-8'." end else res.status = 403 message = "No Text." end res.body = message_to_xml(message) res.content_type = "application/xml; charset=UTF-8" end def do_GET(req, res) message = nil if req.query.key?('text') if req.query['text'].isutf8 message = $sixamo.talk(req.query['text']) else res.status = 403 message = "Input text-charcode is only 'UTF-8'." end else message = $sixamo.talk end res.body = message_to_xml(message) res.content_type = "application/xml; charset=UTF-8" end end class SixamoJson < WEBrick::HTTPServlet::AbstractServlet def do_POST(req, res) message = nil if req.query.key?('text') if req.query['text'].isutf8 res.status = 201 message = "memorize complete." else res.status = 403 message = "Input text-charcode is only 'UTF-8'" end else res.status = 403 message = "No Text." end res.body = message_to_json(message) res.content_type = "application/json; charset=UTF-8" end def do_GET(req, res) message = nil if req.query.key?('text') if req.query['text'].isutf8 message = $sixamo.talk(req.query['text']) else res.status = 403 messge = "Input text-charcode is only 'UTF-8'." end end res.body = message_to_json(message) res.content_type = "application/json; charset=UTF-8" end end srv.mount("/sixamo", SixamoServlet) srv.mount("/sixamo.xml", SixamoServlet) srv.mount("/sixamo.json", SixamoJson) trap("INT") { srv.shutdown } srv.start
設定方法
1. Sixamoを取得する
$ wget http://yowaken.dip.jp/okiba/sixamo/sixamo.rb
2. UTF-8にしてあげる
$ ruby -i.bak -rnkf -e 'print NKF.nkf("-Eu", ARGF.read)' sixamo.rb
3. 6行目の 'e' を 'u' にしてあげる
$ vim sixmao.rb
4. ししゃもさんの辞書ディレクトリをつくってあげる
$ mkdir sixamo
5. ししゃもさんの辞書を初期化してあげる
$ ruby sixamo.rb --init sixamo
6. ししゃもWebAPIサーバ(上記のコード)を起動してみる
$ ruby sixamo_api.rb
7. ためしにブラウザで「http://localhost:10080/sixamo.xml?text=hello」にアクセスしてみる
hello このように表示されれば成功です。
8. 停止してみる
CTRL + C
GETでアクセスすると、ししゃもさんが投げかけた文章を元にお話してくれます。
POSTでアクセスすると、ししゃもさんが投げかけた文章を勉強してくれます。
textパラメータをなげるときは、必ずUTF-8で!
エスケープ処理も忘れずに!
/sixamo.xml にアクセスすると、XMLでレスポンスしてくれます。
/sixamo.json にアクセスすると、JSONでレスポンスしてくれます。
こんなひとにおすすめ!
お粗末でした。*2