個人用途の情報収集の出力形式としてWebServerを使いたい。
標準、ルーティングパッケージ(mux)、WEBフレームワークパッケージ(gin)で簡単なサンプルを書いてみながら動作確認します。
net/http
標準パッケージの“net/http”でサーバー可できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main import ( "net/http" "text/template" ) func handleTmp(w http.ResponseWriter, r *http.Request) { tmpl, _ := template.ParseFiles("tmp.html") tmpl.Execute(w, struct { Title string }{ "たいとる", }) } func main() { http.HandleFunc("/tmp", handleTmp) http.ListenAndServe(":8080", nil) } |
1 2 3 4 5 6 7 8 9 10 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{{.Title}}</title> </head> <body> タイトルは{{.Title}} </body> </html> |
Angularjsのような感じでHTMLファイルを返せます。
http://localhost:8080/tmp
にアクセスするとページが表示されます。
ちなみにハンドリングしてないアドレスでは404が表示されました。
クエリパラメータはr.URL.Query()
で取得できますがパスを使ったクエリ( /tmp/:id
みたいな)などサポートしておらず適当なパッケージを使うべきみたいです。
router
ルーティング用のパッケージを使ってみます。
httprouterがスター数では多いですがgorilla/muxの方がよく見かける気がする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "net/http" "text/template" "github.com/gorilla/mux" ) func handleTmp(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) tmpl, _ := template.ParseFiles("tmp.html") tmpl.Execute(w, struct { Title string }{ vars["val"], }) } func main() { r := mux.NewRouter() r.HandleFunc("/tmp/{val}", handleTmp) http.ListenAndServe(":8080", r) } |
簡単にパスからパラメータを得ることができました。
正規表現による制限も簡単に見える。
とりあえずこれだけでも問題はなさそう。
web framework
他にもいろいろやりたいことを考えると総合的なフレームワークを使いたい。
色々ありますがgin-gonic/ginが頭一つ抜けてるように見えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main import ( "net/http" "github.com/gin-gonic/gin" ) func handleTmp(c *gin.Context) { c.HTML(http.StatusOK, "tmp.html", gin.H{ "Title": c.Param("val"), }) } func main() { r := gin.Default() r.LoadHTMLGlob("./*.html") r.GET("/tmp/:val", handleTmp) r.Run() //=r.Run(":8080") } |
ちょっと毛色は変わりましたがこっちのほうが楽です。
デフォルトで起動するとログも勝手に出してくれます。
このパッケージ単体で大体のことはできそうな気がする。
READMEがわかりやすいのも好印象でした。
micro service
サービス単位で小分けしてAPI疎結合で連携する開発はどうか。
以前に触れていますがマイクロサービスならgo-kit一択だと思います。
少しやってみましたがやっぱり個人で触るものではなさそう。
1つのサービスで同じようなコードを何回も書く苦行になりました。
規模の大きな複数チームでやっと採用を検討するようなものなんだと思います。