A lightweight http framework, custom infinite pole routing
- go get rider
app := rider.New()
app.GET("/path", func(c rider.Context) {
c.Send(200, []byte("ok"))
})
app.USE(func(c rider.Context){})
app.GET("/path", func(c rider.Context){}, func(c rider.Context){},...)
- 只有Kid方法能引入子路由
app.Kid("/path", func(c rider.Context){}, func(c rider.Context){}, func(c rider.Context){}, *rider.Router{})
- GET/POST/PUT/PATCH/DELETE/OPTIONS
- ANY为任意请求方式的路由
- 通过Kid方式注册子路由,支持无限子路由
- 全局的中间件注册
app := rider.New()
app.USE(func(c rider.Context){})
- 路由级的中间件注册
app := rider.New()
app.GET("/path", func(c rider.Context), func(c rider.Context), ...)
- 子路由的中间件注册
app := rider.New()
app.Kid("/path", func(c rider.Context), func(c rider.Context), func(c rider.Context), *rider.Router{})
//获取Response响应体内容
Response() *Response
//获取请求体部分
Request() *Request
//获取app初始化时注册的logger服务,用于生成日志
Logger() *logger.LogQueue
- 见下文
//###获取请求相关的数据,
//给context传递变量,该变量在整个请求的传递中一直有效(中间件传递)
SetLocals(key string, value interface{})
//通过SetLocals设置的值可以在整个响应处理环节通过GetLocals获取
GetLocals(key string) interface{}
- Query
- 注. Query只获取url里面的参数。
//只获取请求url中的查询字符串querystring的map[]string值
Query() url.Values
//根据字段名直接查询querystring某个字段名对应的值
QueryString(key string) string
- Body(). 只获取请求体的内容,包括form格式个multipart格式,(不包含上传文件)
//只获取请求体内的请求参数,
Body() url.Values
//根据字段名直接查询"请求体"某中个字段名对应的值
BodyValue(key string) string
//获取请求路由 /:id/:xx中值,路由参数
Params() map[string]string
//获取请求路由中某字段的值
Param(key string) string
//注册的请求路径中存在正则匹配规则,取得的参数和取正则sub参数一样(详见param例子)
PathParams() []string //通过正则匹配后得到的路径上的一些参数
//当请求头的content-type为multipart/form-data时,获取请求中key对应的文件信息(多个文件时,只会获取第一个)
FormFile(key string) (*UploadFile, error)
//当请求头的content-type为multipart/form-data时,获取请求中key对应的文件列表
FormFiles(key string) ([]*UploadFile, error)
//将file保存,fileName指定完整的路径和名称(先调用FormFile或者FormFiles将返回的file传入即可)
StoreFormFile(file *UploadFile, fileName string) (int64, error)
//先通过FormFiles获取文件列表,指定path目录,存储文件的文件夹。文件名将会用随机字符串加文件的后缀名(file.GetFileExt())
StoreFormFiles(files []*UploadFile, path string) ([]string, error)
//获取请求头信息
Header() http.Header
//根据key获取请求头某一字段的值
HeaderValue(key string) string
//获取请求头的完整url
URL() string
//获取请求头的path
Path() string
//获取响应头的HTTP方法
Method() string
//获取请求来源的IP地址
ClientIP() string
//获取分配的请求id
RequestID() string
//判断请求是否为ajax
IsAjax() bool
//获取请求的cookies
Cookies() []*http.Cookie
//获取请求体中某一字段的cookie值
CookieValue(key string) (string, error)
//##响应相关
//获取响应的状态码
Status() int
//将http请求升级为hijack,hijack的信息保存在HijackUp中
Hijack() (*HijackUp, error)
//给客户端发送文件(可用户静态文件处理)
SendFile(path string) error
//下载,fileName为完整路径,name为下载时指定的下载名称,传""使用文件本身名称,typ指定attachment还是inline的方式下载,默认为attchment
Download(fileName string, name string, typ string) error
//获取完整的响应头信息
WHeader() http.Header
//获取响应头的某一字段值
WHeaderValue(key string) string
//设置cookie
SetCookie(cookie http.Cookie)
//根据cookie名删除cookie
DeleteCookie(cookieName string)
//获取系统默认注册的jwt服务("github.com/dgrijalva/jwt-go"),具体使用例子参考example/jwt
Jwt() *riderJwter
//注入jwt(使用前必须先注入服务)
setJwt(jwter *riderJwter)
//设置响应头
SetHeader(key, value string)
//给响应头添加值
AddHeader(key, value string)
//给响应头设置contenttype
SetCType(contentType string)
//重定向
Redirect(code int, targetUrl string)
//给客户端发送数据
Send(code int, d []byte) (int, error)
//给客户端发送json格式的数据
SendJson(code int, i interface{}) (int, error)
//负责模板渲染 ,只要实现了BaseRender,注册app服务是直接修改tplsRender的值
Render(tplName string, data interface{})
- locals
- main.go
app := rider.New()
app.USE(
func(c rider.Context) {
c.SetLocals("locals", "this is the first locals")
c.SetLocals("locals2", "this is the second locals")
c.Next()
},
)
app.Kid("/", router.Router())
app.Listen(":5003")
- child.go
func Router() *rider.Router {
router := rider.NewRouter()
router.GET("/", func (c rider.Context) {
fmt.Println(c.GetLocals("locals"))
fmt.Println(c.GetLocals("locals2"))
c.Send(200, []byte("ok"))
})
router.GET("/xx", func (c rider.Context) {
fmt.Println(c.GetLocals("locals"))
fmt.Println(c.GetLocals("locals2"))
c.Send(200, []byte("ok2"))
})
return router
}
- download
go c.Download(filename, name, type)
- @params
- 1: filename: 文件所在路径加全名
- 2: name: 指定下载时文件的名称,不指定默认取路径中的名称
- 3: type: 下载文件的方式,attachment和inline。
app.GET("/download", func(c rider.Context) {
c.Download(filename, name, type)
})
- jwt
- 作为中间件引入
app := rider.New()
app.USE(rider.RiderJwt("rider", time.Hour))
app.GET("/token", func(c rider.Context) {
token, _ := c.Jwt().Set("test", " test")
c.Send(200, []byte(token))
})
app.GET("/tokenparse", func(c rider.Context) {
c.Logger().INFO(c.CookieValue("token"))
c.Jwt().Delete("test")
c.Jwt().DeleteAll()
c.Jwt().Set("a", "b")
fmt.Println(c.Jwt().Claims())
fmt.Println(c.Jwt().ClaimsValue("a"))
})
app.Listen(":5002")
- logger
- 注册服务后,日志模块会一同注册。
- 通过smtp服务可以注册邮箱日志
- 调用
go app.Logger(8)
修改日志等级 - 日志等级分为 1): fatalLevel uint8 = iota
- 日志打印的同时服务也会退出
c.Logger().FATAL("")
2): panicLevel
c.Logger().PANIC("")
3): errorLevel
c.Logger().ERROR("")
4): warningLevel
c.Logger().WARNING("")
5): infoLevel
c.Logger().INFO("")
6): consoleLevel
c.Logger().CONSOLE("")
7): debugLevel
c.Logger().DEBUG("")
app := rider.New()
rlog := app.Logger(8)