Golang之HTTP路由设计(三)

本文探讨了Golang中HTTP路由设计的重要性,并详细介绍了如何动手编写自己的路由,包括核心文件`framework/core.go`和`framework/group.go`的改造,以及如何实现动态路由。文章通过改造`core.go`,引入动态路由数据结构,并提供了验证动态路由功能的Controller示例。
摘要由CSDN通过智能技术生成

Golang之HTTP路由设计

为什么要设计路由规则,路由规则是HTTP的请求按照一定的规则 ,匹配查找到对应的控制器并传递执行的逻辑!

自己编写路由的话需要注意一下一共有几种路由!

  1. 一种是支持原生的restful四种类型的访问方法!Get,Post,Delete,Put
  2. 需要支持自定义的路径,也就是静态路由
  3. 批量通用前缀,也就是下面我们将讲到的group
  4. 动态路由匹配!

也就是像这样我们在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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值