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

bingo

这是自己写的一个轻量级的golang restful api web框架,基于httprouter组件
项目地址:https://github.com/peachestao/bingo,欢迎大家使用并踊跃提bug,我会第一时间处理

快速使用

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值