gin框架注册struct路由

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指针对象,第二个是一个匹配规则。这里默认的是根据请求方法的名字来匹配规则,使用这种注册不会产生多余的路由。你可以重写注册的structGetActions方法来覆盖默认的匹配规则。

使用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()
}

RestRouterRouter的进阶版本, 它可以自动的根据事先定义好的方法去注册对应的路由,并且支持对象级路由,如上的例子对象的路由为

[GIN-debug] GET    /user                     --> reflect.methodValueCall (4 handlers)
[GIN-debug] POST   /user                     --> reflect.methodValueCall (4 handlers)

如果你使用过djangorestframework,你会很轻松的理解这个路由匹配方式

posted @ 2020-11-09 10:54  Ivy丶  阅读(634)  评论(0编辑  收藏  举报