Golang之HTTP路由设计
为什么要设计路由规则,路由规则是HTTP的请求按照一定的规则 ,匹配查找到对应的控制器并传递执行的逻辑!
自己编写路由的话需要注意一下一共有几种路由!
- 一种是支持原生的restful四种类型的访问方法!
Get
,Post
,Delete
,Put
- 需要支持自定义的路径,也就是静态路由
- 批量通用前缀,也就是下面我们将讲到的
group
- 动态路由匹配!
也就是像这样我们在route.go
去注册
func registerRouter(core *framework.Core) {
print(111)
// 设置控制器
core.Get("/foo", FooController)
core.Get("/user/login", UserLoginController)
subjectApi := core.Group("/subject")
{
// restful路由,根据请求类型区分了开,:id为动态路由
subjectApi.Get("/list/all", SubjectListController)
subjectApi.Post("/add", SubjectListController)
subjectApi.Delete("/:id", SubjectListController)
subjectApi.Put("/:id", SubjectListController)
subjectApi.Get("/:id", SubjectListController)
}
}
动手编写自己的路由
在上一节中我们编写了自己的请求处理器,对应在里面加入我们的路由规则就好了!
framework/core.go
package framework
import (
"net/http"
"strings"
)
const (
GET = "GET"
PUT = "PUT"
DELETE = "DELETE"
POST = "POST"
)
//map[string]map[string]ControllerHandler 前面存请求类型后面是路径对应执行方法
type Core struct {
router map[string]map[string]ControllerHandler
}
func (c Core) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
ctx:= NewContext(request, writer)
router:=c.FindRouteByRequest(request)
if router==nil{
ctx.Json(404,"router not found ")
return
}
if err:=router(ctx);err!=nil{
ctx.Json(500,"server Interval")
return
}
//http.DefaultServeMux.ServeHTTP(writer, request)
}
func NewCore() *Core {
getRouter := map[string]ControllerHandler{
}
postRouter := map[string]ControllerHandler{
}
putRouter := map[string]ControllerHandler{
}
deleteRouter := map[string]ControllerHandler{
}
core := &Core{
router: make(map[string]map[string]ControllerHandler, 0),
}
// 初始化好四种类型的路由map
core.router[GET] = getRouter
core.router[POST] = postRouter
core.router[PUT] = putRouter
core.router[DELETE] = deleteRouter
return core
}
// 注册Get方法
func (c *Core) Get(pattern string, handler ControllerHandler) {
url := strings.ToUpper(pattern)
c.router[GET][url] = handler
}