Golang——router

本文介绍了如何在Golang中使用自定义和httprouter包进行路由设置,包括基本路由、封装以及使用第三方库进行路由管理。

Golang 路由学习

# http package

package route

import (
	"fmt"
	"net/http"
	"strings"
)

type myRoute1 struct {
	handlers map[string][]*handle
}

type handle struct {
	path string
	http.HandlerFunc
}

func Router() {
	// 简单路由
	//_simpleRoute()

	// 简易封装
	//_Router1()

	// 路由封装2
	_Router2()
}

/**
 * @notes 增加路由
 */
func (m *myRoute1) addRouter(method string, path string, fun http.HandlerFunc) {
	h := &handle{path, fun}
	requestMethod := strings.ToLower(method)
	m.handlers[requestMethod] = append(m.handlers[requestMethod], h)

}

/***
 * 路由方法处理
 */
func (m *myRoute1) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	// 处理静态文件
	url := strings.Split(strings.TrimLeft(r.URL.Path, "/"), "/")
	requestMethod := strings.ToLower(r.Method)
	for _, handler := range m.handlers[requestMethod] {
		requestPath := fmt.Sprintf("/%s", strings.ToLower(url[0]))
		if handler.path == requestPath {
			//调用的是func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }
			handler.ServeHTTP(w, r)
			return
		}
	}

	http.NotFound(w, r)
	return
}

/*
 * 简单方式
func (p *myRoute1) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	// Lists、Add、Delete 执行函数
	urlPath := r.URL.Path
	if urlPath == "/list" {
		Lists(w, r)
		return
	}

	if urlPath == "/add" {
		Add(w, r)
		return
	}

	if urlPath == "/delete" {
		Delete(w, r)
		return
	}
}
*/

//  路由方式1
/*
func newMYnum() *myRoute1 {
	return &myRoute1{} //等同于  return new(MyMux)
}
*/

func newMYnum() *myRoute1 {
	return &myRoute1{make(map[string][]*handle)}
}

/**
 * @notes listen
 */
func (m *myRoute1) _listenPort(port string) {
	err := http.ListenAndServe(port, m)
	if err != nil {
		fmt.Println("listen-server-failed")
		fmt.Println(err)
	}
}

/***
 * @notes 创建路由器、封装路由
 */
func _Router2() {
	mux := newMYnum()
	// Lists、Add、Delete 执行函数
	mux.addRouter("get", "/list", Lists)
	mux.addRouter("post", "/add", Add)
	mux.addRouter("post", "/delete", Delete)
	mux._listenPort(":8060")

}

/***
 * @notes 创建路由器、封装路由【简易封装】
 */
func _Router1() {
	mux := &myRoute1{}
	err := http.ListenAndServe(":8060", mux)
	if err != nil {
		fmt.Println("listen-server-failed")
		fmt.Println(err)
	}

}

/**
 * @notes 简单路由实例
 */
func _simpleRoute() {
	http.HandleFunc("/list", Lists)
	http.HandleFunc("/add", Add)
	http.HandleFunc("/delete", Delete)
	err := http.ListenAndServe(":8060", nil)
	if err != nil {
		fmt.Println("listen-server-failed")
		fmt.Println(err)
	}
}

github-httprouter-package

注意:需要下载扩展包

package route

import (
	"fmt"
	HttpRouterPackage "github.com/julienschmidt/httprouter"
	article "library_system/controller/article"
	"net/http"
)

func HttpRouter()  {
	router := HttpRouterPackage.New()
	router.GET("/list", Lists)

	err := http.ListenAndServe(":8060", router)
	if err != nil {
		fmt.Println(err)
	}
}


func Lists(response http.ResponseWriter, request *http.Request, _ httprouter.Params) {
	fmt.Println("http-router")
}

文档转载

  Router 路由封装
  github–httprouter 扩展包

### Golang 中间件实现与使用教程 #### 定义中间件概念 在Web开发框架中,中间件是指位于服务器接收请求和发送响应之间的函数。这些函数可以在请求到达最终处理器之前对其进行预处理,在响应返回给客户端前进行后置处理[^1]。 #### Gin 框架中的中间件特性 对于采用Gin框架的应用程序来说,中间件提供了一种灵活的方式来增强HTTP路由的功能而不必修改核心业务逻辑代码。利用中间件能够轻松加入诸如身份验证、访问控制、日志记录等功能模块到应用程序之中[^2]。 #### 创建自定义中间件实例 下面展示了一个简单的基于时间戳的日志记录器作为Gin中间件的例子: ```go func Logger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() // 设置变量来存储当前的时间戳 c.Set("request-time", t) // 处理请求 c.Next() // 记录并打印执行耗时 log.Printf("%s\t%s\t%s\n", c.Request.Method, c.Request.URL.Path, time.Since(t)) } } ``` 此段代码创建了一个名为`Logger()` 的函数,它返回一个实现了 `gin.HandlerFunc` 接口的方法。当该方法被调用时会先获取当前时刻,并将其存入上下文中;接着继续传递控制权至下一个处理器(`c.Next()`);最后计算整个过程所花费的时间并将信息输出到标准错误流上。 #### 注册全局或局部中间件 要使上述编写的中间件生效,则需注册它们成为应用的一部分。可以通过两种方式完成这一步骤——要么是在启动服务端的时候设置成全局性的(即应用于所有的路由),要么针对特定路径单独指定局部使用的中间件。 ##### 全局中间件配置示例: ```go router.Use(Logger(), Recovery()) ``` 这里假设还存在另一个用于捕获异常恢复的服务`Recovery()` ,两者共同作用于所有API接口之上。 ##### 局部中间件配置示例: ```go auth := router.Group("/admin", AuthRequired()) { auth.GET("/dashboard", GetDashboard) } ``` 在这个例子中,只有以 `/admin` 开头的URL才会受到鉴权机制的影响。 #### 学习更多有关GoLang中间件的知识 除了官方文档外,网络上有许多优质的第三方资料可以帮助开发者深入了解这一主题。例如,“golang stats api handler”的开源项目提供了关于性能统计方面的实用工具集,可能对某些场景下的监控需求有所启发[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值