前言
最近在学习Go语言的http开发,打算写一个简单的Http api框架,总结一下
框架设计
简单设计了几个api
get和post
1 | engine.MapGet("/hello", helloHandler) |
中间件
1 | engine.Use(func(ctx *engine.Contex) { |
静态文件
1 | engine.UseStaticFiles("./public") // 设置静态资源根目录 |
其实go自带的http服务就很不错了,基本上是主流编程语言中非框架的最简单的实现了,本框架主要是做了一些简单的封装,加上静态文件和中间件支持,然后把返回结构设计成了函数返回,自动进行json序列化
具体查看jeanhua/jokerhttp: go开发的简单http框架
遇到的小坑
中间件问题
原本的实现是
1 | ctx := &Contex{ |
这里的中间件是引用全局的中间件,但是没注意到路由污染,虽然测试时没发现什么问题,但是我突然灵机一动(可能就是xw老师说的语感🤔),发现了这个问题,如果一个路由没有写回,就会传导到下一个路由,但是由于封装的返回值,每个路由都是会写回的,误打误撞不会触发这个问题,但是严谨起见,还是改了下面这种
1 | ctx := &Contex{ |
相对路径问题
测试静态文件服务时
1 | // 静态文件服务 |
访问静态文件时自动重定向到了/
,我明明没写这个重定向逻辑,后面发现了是运行路径的问题,这是子文件夹下的代码和静态文件,我的vscode的terminal的目录是在项目根目录下,导致相对路径出现问题,找不到文件时go内置的静态文件服务器返回到了根目录🤣,只需要cd
到当前目录下再go run main.go
就行了