Ginrest的簡單實用
ginrest是我寫的一個關於gin框架的輔助插件,它可以幫助你在開發中省去一些冗余的步驟
安裝
go get github.com/Ivy1996-encode/ginrest
原生gin中使用
package main
import (
"github.com/Ivy1996-encode/ginrest"
"github.com/gin-gonic/gin"
"net/http"
)
type User struct{}
func (*User) Get(c *gin.Context) {
c.JSON(http.StatusOK, "user list")
}
func (*User) Post(c *gin.Context) {
c.JSON(http.StatusOK, "user list")
}
func main() {
server := gin.Default()
server.Any("/user", ginrest.AsMethodHandlerFunc(new(User)))
server.Run()
}
使用gin
原生的路由注冊方式,使用ginrest.AsMethodHandlerFunc
將我們的結構體注冊進去,它回去根據請求方法的名稱去匹配對應的handler
,這樣就可以不用寫多個路由去匹配不同的請求方式了。
但是這種寫法會生成多余的路由。
使用router
package main
import (
"github.com/Ivy1996-encode/ginrest"
"github.com/gin-gonic/gin"
"net/http"
)
type User struct{}
func (*User) Get(c *gin.Context) {
c.JSON(http.StatusOK, "user list")
}
func (*User) Post(c *gin.Context) {
c.JSON(http.StatusOK, "user list")
}
func main() {
server := ginrest.Default()
router := ginrest.Router(server, ginrest.MethodsActions)
router.Register("/user", new(User))
server.Run()
}
使用ginrest
提供的路由來為我們注冊對於的handler
,路由接受兩個參數,第一個是我們的默認的*gin.Engine
指針對象,第二個是一個匹配規則。這里默認的是根據請求方法的名字來匹配規則,使用這種注冊不會產生多余的路由。你可以重寫注冊的struct
的GetActions
方法來覆蓋默認的匹配規則。
使用RestRouter
package main
import (
"github.com/Ivy1996-encode/ginrest"
"github.com/gin-gonic/gin"
"net/http"
)
type User struct{}
func (*User) List(context *gin.Context) {
context.JSON(http.StatusOK, "user list")
}
func (*User) Retrieve(context *gin.Context) {
context.JSON(http.StatusOK, "user detail")
}
func main() {
server := ginrest.Default()
router := ginrest.RestRouter(server)
router.Register("/user", new(User))
server.Run()
}
RestRouter
是Router
的進階版本, 它可以自動的根據事先定義好的方法去注冊對應的路由,並且支持對象級路由,如上的例子對象的路由為
[GIN-debug] GET /user --> reflect.methodValueCall (4 handlers)
[GIN-debug] POST /user --> reflect.methodValueCall (4 handlers)
如果你使用過djangorestframework,你會很輕松的理解這個路由匹配方式