2012年7月25日水曜日

Go言語のWebフレームワーク"goweb"をGAE/Gで動かす

昨日、公開された(?)Go言語のWebフレームワークの"goweb"を早速GAE/Gで動作するか
試してみました。

導入方法は、以下のように行います。

  1. gowebのソースコードをダウンロードする。
    1. go get code.google.com/p/goweb/goweb
    2. Google Codeからダウンロードする。
    • 1の方法を使った場合は、$GOPATH配下か、GOPATHがなければ、Go言語のコマンドがあるディレクトリにダウンロードされます。
    • ダウンロードを行った場合は、任意のディレクトリに展開して下さい。
  2. ダウンロード後展開 or go getで取得したディレクトリ配下のgowebディレクトリをGAE/Gのアプリケーションディレクトリにコピーする。(GAE/Gの場合は、GOPATH変数を認識しないので、手動でコピーしておく必要があります)
  3. 以下のようなプログラムを作成し、実行する。

package testapp

import (
 "appengine"
 "goweb"
 "fmt"
 "net/http"
)

type PeopleController struct {}
func (p *PeopleController) HandleRequest(c *goweb.Context) {
 context := appengine.NewContext(c.Request)
 context.Debugf("PeopleController#HandleRequest Called.")
 fmt.Fprintf(c.ResponseWriter, "You are looking for person with ID %s", c.PathParams["id"])
 fmt.Fprintf(c.ResponseWriter, "\nServerSoftware = %s", appengine.ServerSoftware())
}

func init() {

 var peopleController *PeopleController = new(PeopleController)
 goweb.Map("/people/{id}", peopleController)

 goweb.ConfigureDefaultFormatters()
 http.Handle("/", goweb.DefaultHttpHandler)
}

gowebパッケージはapp.yamlがあるディレクトリにコピーしておけば良いです。

URLは、http://localhost:8080/people/testみたいな感じにすると、結果が返ってくる事が
わかると思います。

また、appengineのAPIを実行する場合にappengine.Contextを取得したい時は、
HandleRequestメソッドの引数cからappengine.Contextを生成できます。

context := appengine.NewContext(c.Request)

ソースコードもこれから読んでみようと思っていますが、フレームワークを利用せずに
作成するよりはだいぶ楽かもしれないですね。

ちなみに、gowebのディレクトリの中に、goweb_testappディレクトリがあって、その中には
以前のGAE/Gのバージョンで試していた形跡があります。
api_version: 2なので、1.5.3以前かな?