万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

ginでGroup化したルーティング

いままでこんな書き方してたが冗長。

func (controller *ShopsController) Setup() {
        controller.Router.POST("/shops", controller.createShop)
        controller.Router.GET("/shops", controller.listShops)
        controller.Router.GET("/shops/:shop_id", controller.getShop)
        controller.Router.PUT("/shops/:shop_id", controller.updateShop)
        controller.Router.DELETE("/shops/:shop_id", controller.deleteShop)
}

Martiniはこうかける GitHub - go-martini/martini: Classy web framework for Go

Ginにもあった。 GitHub - gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.

Grouping routes

func main() {
    router := gin.Default()

    // Simple group: v1
    v1 := router.Group("/v1")
    {
        v1.POST("/login", loginEndpoint)
        v1.POST("/submit", submitEndpoint)
        v1.POST("/read", readEndpoint)
    }

    // Simple group: v2
    v2 := router.Group("/v2")
    {
        v2.POST("/login", loginEndpoint)
        v2.POST("/submit", submitEndpoint)
        v2.POST("/read", readEndpoint)
    }

    router.Run(":8080")
}

私の例は、https://github.com/dcu/gin-scaffoldを使ってるので、

以下のようになる。 controller.Routerを変数v1に置き換えたような感じに。

func (controller *ShopsController) Setup() {

        v1 := controller.Router.Group("/shops")
        {
                v1.POST("", controller.createShop)
                v1.GET("", controller.listShops)
                v1.GET("/:shop_id", controller.getShop)
                v1.PUT("/:shop_id", controller.updateShop)
                v1.DELETE("/:shop_id", controller.deleteShop)
        }
}

気をつけるのは、v1.GET("", controller.listShops)これ。 /を入れてv1.GET("/", controller.listShops)としてしまうと、 http://localhost:4000/shopsでなくhttp://localhost:4001/shops/のように最後に/が必要だし 色々なページのURLが変わってしまう。