m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

golangでgorillaとかいうのを使ってみる(mux)

ゴリラ?

Gorilla, the golang web toolkit
まあ、http関連のやつでルーティングとかセッションとかを"net/http"よりは柔軟に使える感じのもの
なんか適当に調べたけど"net/http"ではセッションは使えないとかなんとか

ちょっと今回はルーティングの"gorilla/mux"を使用する

マニュアル

http://www.gorillatoolkit.org/pkg/mux

今回はさわりだけ…

インストール

go get github.com/gorilla/mux

実装

今回の構成
.
├── main.go
└── templates
    ├── index.html
    └── save.html
main.go
package main

import (
	"net/http"
	"github.com/gorilla/mux"
	"fmt"
	"time"
	"html/template"
)

func main(){

	// 生成
	r := mux.NewRouter()

	// "/"の場合の処理
	r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

		// テンプレート
		tmpl := template.Must(template.New("index").ParseFiles("templates/index.html"))
		err := tmpl.Execute(w, nil)
		if err != nil {
			panic(err)
		}

		// logの代わり
		fmt.Print(time.Now())
		fmt.Printf(" path: " + r.URL.Path + "\n")
	}).Methods("GET")

	// "/save"の場合の処理
	r.HandleFunc("/save", func(w http.ResponseWriter, r *http.Request) {

		// formの値を取得
		r.ParseForm()
		data1 := r.FormValue("aaa")
		data2 := r.FormValue("bbb")

        // テンプレート
        tmpl := template.Must(template.New("save").ParseFiles("templates/save.html"))
        err := tmpl.Execute(w, struct {
			Data1 string
			Data2 string
		}{
			Data1: data1,
			Data2: data2,
		})
		if err != nil {
			panic(err)
		}

		// logの代わり
		fmt.Print(time.Now())
		fmt.Printf(" path: " + r.URL.Path + "\n")
	}).Methods("POST")

	// 可変URL1
	r.HandleFunc("/test1/{sample1}/", func(w http.ResponseWriter, r *http.Request) {
		// 画面サンプル
		fmt.Fprintf(w, "sample1\n")

		// logの代わり
		fmt.Print(time.Now())
		fmt.Printf(" path: " + r.URL.Path + "\n")
	})

	// 可変URL2
	r.HandleFunc("/test2/{sample1}/{id:[0-9]{1,6}}/", func(w http.ResponseWriter, r *http.Request) {
		// 画面サンプル
		fmt.Fprintf(w, "sample2\n")

		// logの代わり
		fmt.Print(time.Now())
		fmt.Printf(" path: " + r.URL.Path + "\n")
	})

	// handing
	http.Handle("/", r)

	// 設定
	http.ListenAndServe(":9001", nil)
}

※POST、GETだけを指定したい場合など、また一部のURLが可変になる場合は楽できます。

templates/index.html
{{ define "index" }}
<!DOCType html>
<html>
<head>
	<meta charaset="utf-8" />
	<title>websample1</title>
</head>
<body>
	<h3>なんかいれて送信してみて</h3>
	<form method="post" action="/save">
		<input type="text" name="aaa" value="" /><br />
		<input type="text" name="bbb" value="" /><br />
		<input type="submit" value="送信" />
	</form>
</body>
</html>
{{ end }}
templates/save.html
{{ define "save" }}
<!DOCType html>
<html>
<head>
	<meta charaset="utf-8" />
	<title>websample1</title>
</head>
<body>
	<h3>送信されたものは以下</h3>
	<div>
		aaa = {{ .Data1 }}<br />
		bbb = {{ .Data2 }}<br />
	</div>
	<a href="/">top</a>
</body>
</html>
{{ end }}

画面

f:id:m_shige1979:20160209223846p:plain

f:id:m_shige1979:20160209223856p:plain

f:id:m_shige1979:20160209223907p:plain

所感

このツールキットを使用することでネットワーク関連のコードを書くのに結構便利になる感じかと
web アプリを作成するとしたらルーティングとセッションは必須なのできちんとやっておく必要がありそうです。