自己用go写的一个轻量级的 restful api 框架 bingo

peachestao · · 468 次点击 · 开始浏览    置顶
## bingo 这是自己写的一个轻量级的golang restful api web框架,基于httprouter组件 项目地址:https://github.com/peachestao/bingo ,欢迎大家使用 ## 快速使用 ### 1、下载 go get github.com/peachestao/bingo ### 2、例子 ~~~ package main import ( "github.com/peachestao/bingo" ) func main(){ engine := bingo.New() engine.GET("/api/v1/hello", func(c *bingo.Context) { c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":"hello bingo", }) }) engine.Run("127.0.0.1:8008") } ~~~ ## 功能介绍 ### 1、handler 一个请求支持任意多的handler处理函数,通过Context的Next方法串连执行,如果想终止后续调用不调用Next方法返回响应即可,这种形式经常用于用户身份验证,如果不合法提前退出 ~~~ engine.GET("/api/v1/hello", func(c *bingo.Context) { token:=c.Query('token') if !checkValid(token){ c.JSON(200,bingo.Res{ "status":-1, "msg":"认证不通过", "data":null, }) return } c.Next() }, func(c *bingo.Context) { c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":"hello bingo", }) }) ~~~ 一般我们将handler分成单独函数的形式,代码组织清爽 ~~~ func auth(c *bingo.Context){ token:=c.Query("token") if !checkValid(token){ c.JSON(200,bingo.Res{ "status":-1, "msg":"认证不通过", "data":null, }) return } c.Next() } func hello(c *bingo.Context) { c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":"hello bingo", }) }) engine.GET("/api/v1/hello", auth, hello) ~~~ ### 2、中间件 用法: engine.use(m MiddleWare),支持链式调用engine.use(m1).use(m2)... 例如,实现一个记录所有请求的处理时间的功能,我们可以定义如下方法 ~~~ func logger()bingo.HandlerFunc{ return bingo.HandlerFunc(func(c *bingo.Context){ startTime:= time.Now() c.Next() endTime:=time.Now() path:=c.Req.URL.Path takeTime:=strconv.FormatInt(endTime.Sub(startTime).Milliseconds(),10)// strconv.FormatInt((endTime-startTime),10) method:=c.Req.Method fmt.Printf("%s %s %sms\n",path,method,takeTime ) }) } ~~~ 然后engine.use(logger)即可 ### 3、路由 支持GET、POST、PUT、DELETE等http谓词,用法如下: ~~~ engine.GET("/api/v1/hello", func(c *bingo.Context) { })) engine.POST("/api/v1/hello", func(c *bingo.Context) { })) engine.DELETE("/api/v1/hello", func(c *bingo.Context) { })) engine.PUT("/api/v1/hello", func(c *bingo.Context) { })) ~~~ ### 4、请求上下文 将req,res数据封装在bingo.Context对象中: 1)、Query方法用于获取get传值 ~~~ engine.GET("/api/v1/hello", func(c *bingo.Context) { name:=c.Query("name") c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":name, }) }) ~~~ 2)、PostForm方法用于获取post 表单传值 ~~~ engine.GET("/api/v1/hello", func(c *bingo.Context) { name:=c.PostForm("name") c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":name, }) }) ~~~ 3)、Param方法获取存储url中":id"形式的可变参数值,通过Param("id")形式获取 如:http://127.0.0.1:8008/api/v1/hello/peachesTao ~~~ engine.GET("/api/v1/hello/:uid", func(c *bingo.Context) { uid:=c.Param("uid")) c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":"hello "+uid, }) }) ~~~ 4)、JSON方法返回json格式响应数据,第一个参数为http 状态码,第二个参数为map类型的数据,可以自定义键值对 ~~~ engine.GET("/api/v1/hello", func(c *bingo.Context) { c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":"hello bingo", "diyKey":"diyValue", }) }) ~~~ 5)、DiyParam属性用于各个handler之间传值,set方法用于设置某个key的值,get方法用于获取某个key值。它非常有用,比如请求过来后第一个handler负责认证,如果通过则解析出uid,然后通过DiyParam Set方法传递给其他handler,其他handler直接通过Get方法获取,不需要每个handler要获取uid时都去解析 ~~~ func auth(c *bingo.Context){ token:=c.Query("token") if valided,uid:=checkValid(token);!valided{ c.JSON(200,bingo.Res{ "status":-1, "msg":"认证不通过", "data":null, }) return } c.DiyParam.Set("uid",uid) //认证通过后将解析出来的uid存储到DiyParam中,供后续handler调用 c.Next() } func hello(c *bingo.Context) { uid:=c.DiyParam.Get("uid") //获取存储在DiyParam中的uid c.JSON(200,bingo.Res{ "status":0, "msg":"这是一个轻量级的golang restful api风格的后端框架", "data":"hello "+uid, }) }) engine.GET("/api/v1/hello", auth, hello) ~~~

有疑问加站长微信联系

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:812540095

468 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传