はじめに
最近、Goを始めました。
はじめにGinを使ってみて、軽量フレームワークの良さはあったんですが、
規模が大きいものをつくるときには、MVCなフレームワークがいいなあと思いトライしてみます。
環境情報
Goはインストール済みとします。
MacであればHomebrewでインストールしてパスを通すくらいですね。
$ go version
go version go1.13.7 darwin/amd64
$ echo $GOPATH
/Users/yourname/go
インストール
フレームワークをインストールします
go get github.com/revel/revel
次に、コマンドラインでrevelコマンドを使えるようにツールをインストールします。
go get github.com/revel/cmd/revel
完了したらコマンドが実行できるか確認
$ revel version
Revel executing: displays the Revel Framework and Go version
Revel Framework : 0.21.0 (0.21.0 remote master branch)
Revel Cmd : 0.21.1 (0.21.1 remote master branch)
Revel Modules : 0.21.0 (0.21.0 remote master branch)
go version go1.13.7 darwin/amd64
OKですね。
アプリ作成
revelコマンドを使ってアプリを作成します。
cd $GOPATH
revel new revel-sample
コマンドを実行したらこちらのようなログが出たと思います。
$ revel new revel-sample
Revel executing: create a skeleton Revel application
Your application has been created in:
/Users/yourname/go/src/revel-sample
You can run it with:
revel run -a revel-sample
そしたら、実行してみましょう。
revel run -a revel-sample
起動したら http://localhost:9000/ をブラウザで開くと、It works! と表示されたらOKです。
ファイルを修正
それでは、http://localhost:9000/helloworld を開くとHello World! と表示されるように修正してみましょう。
初期のディレクトリはこのようになっております。
$ tree
├── README.md
├── app
│ ├── controllers
│ │ └── app.go
│ ├── init.go
│ ├── routes
│ │ └── routes.go
│ ├── tmp
│ │ ├── main.go
│ │ └── run
│ │ └── run.go
│ └── views
│ ├── App
│ │ └── Index.html
│ ├── debug.html
│ ├── errors
│ │ ├── 404.html
│ │ └── 500.html
│ ├── flash.html
│ ├── footer.html
│ └── header.html
├── conf
│ ├── app.conf
│ └── routes
├── messages
│ └── sample.en
├── public
│ ├── css
│ │ └── bootstrap-3.3.6.min.css
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── img
│ │ └── favicon.png
│ └── js
│ ├── bootstrap-3.3.6.min.js
│ └── jquery-2.2.4.min.js
└── tests
└── apptest.go
16 directories, 24 files
Hello World
まずは、ルーティングを追加します。
conf/routesを開いてください。※app/routes/routes.goではありません。
最初に表示した画面のルートが以下のように設定されていることが確認できます。
GET / App.Index
ルートを追加してみましょう。
ここでのコントローラ名とメソッド名は先頭が大文字とする仕様のようです。
GET /helloworld Hello.Index
そしたら、次にコントローラと作っていきます。
app/controllers/hello.goを以下のように作ります。
package controllers
import (
"github.com/revel/revel"
)
// Hello is struct for revel
type Hello struct {
*revel.Controller
}
// Index of Hello
func (h Hello) Index() revel.Result {
return h.Render()
}
ビューとコントローラの紐付けはデフォルトで
app/views/コントローラ名/メソッド名 となっているので、
app/views/hello/index.html を作成します。
<h1>Hello World</h1>
これで一通り、ルーティング→コントローラ→ビューまでできたので実行してみましょう。http://localhost:9000/helloworld にアクセスすると
Hello Worldと表示されていることが確認できたかと思います。
Hello, Karaage
次に、コントローラから変数を渡してみましょう。
controllerのhello.goを以下のように修正します。
func (h Hello) Index() revel.Result {
name := "Karaage"
return h.Render(name)
}
そして、ビュー側で変数を表示できるように
app/views/hello/index.html を以下のように修正します。
<h1>Hello, {{ .name }}</h1>
そしてページを更新してみると、Hello, Karaageと表示できるようになったことが確認できました。
Json
次に、htmlでなくjsonでレスポンスを返してみましょう。
http://localhost:9000/helloworld/json にGETリクエストを送るとHello Worldを返すようにしてみます。
まずは、conf/routesに以下の設定を追加します。
GET /helloworld/json Hello.GetJSON
ルーティングの設定からわかるように、新たにGetJSONというメソッドを
app/controllers/hello.goに追加します。
また、レスポンス用のstructをResponseとして作ります。
// Response is struct for json response
type Response struct {
Message string `json:"message"`
}
// GetJSON returns Json of Hello World
func (h Hello) GetJSON() revel.Result {
data := Response{Message: "Hello World"}
return h.RenderJSON(data)
}
これで修正は完了です。
curlを使って実行してみましょう。
$ curl http://localhost:9000/helloworld/json
{
"message": "Hello World"
}
JSONでmessageがHello Worldのレスポンスが返ってきたことが確認できました。
まとめ
Revelのはじめの一歩が踏み出せましたね!
まだまだいろんな機能があるようなので、学びながらまとめていこうと思います!
コメント