Simple and easy go web micro framework

Overview

DotWeb

Simple and easy go web micro framework

Important: Now need go1.9+ version support, and support go mod.

Document: https://www.kancloud.cn/devfeel/dotweb/346608

Guide: https://github.com/devfeel/dotweb/blob/master/docs/GUIDE.md

Gitter GoDoc Go Report Card Go Build Card Golang-Devfeel

1. Install

go get github.com/devfeel/dotweb

2. Getting Started

package main

import (
	"fmt"
	"github.com/devfeel/dotweb"
)

func main() {
	//init DotApp
	app := dotweb.New()
	//set log path
	app.SetLogPath("/home/logs/wwwroot/")
	//set route
	app.HttpServer.GET("/index", func(ctx dotweb.Context) error{
		return ctx.WriteString("welcome to my first web!")
	})
	//begin server
	fmt.Println("dotweb.StartServer begin")
	err := app.StartServer(80)
	fmt.Println("dotweb.StartServer error => ", err)
}

examples: https://github.com/devfeel/dotweb-example

3. Features

  • 支持go mod
  • 支持静态路由、参数路由、组路由
  • 路由支持文件/目录服务,支持设置是否允许目录浏览
  • HttpModule支持,支持路由之前全局级别的自定义代码能力
  • 中间件支持,支持App、Group、Router级别的设置 - https://github.com/devfeel/middleware
  • Feature支持,可绑定HttpServer全局启用
  • 支持STRING/JSON/JSONP/HTML格式输出
  • 集成Mock能力
  • 支持自定义Context
  • 集成Timeout Hook
  • 全局HTTP错误处理
  • 全局日志处理
  • 支持Hijack与websocket
  • 内建Cache支持
  • 内建Session支持 - 支持主备redis自动切换
  • 内建TLS支持
  • 支持接入第三方模板引擎(需实现dotweb.Renderer接口)
  • 模块可配置
  • 自集成基础统计数据,并支持按分钟为单位的间隔时间统计数据输出

Config Example

4. Performance

DotWeb  1.9.2  16core16G                      
cpu 内存 Samples Average Median 90%Line 95%Line 99%Line Min Max Error% Throughput Received KB/Sec Send KB/Sec
40% 39M 15228356 19 4 43 72 204 0 2070 0.00% 48703.47 7514.79 8656.28
40% 42M 15485189 18 4 41 63 230 0 3250 0.00% 49512.99 7639.7 8800.16
40% 44M 15700385 18 3 41 64 233 0 2083 0.00% 50203.32 7746.22 8922.86
                           
ECHO 1.9.2 16core16G                      
cpu 内存 Samples Average Median 90%Line 95%Line 99%Line Min Max Error% Throughput Received KB/Sec Send KB/Sec
38% 35M 15307586 19 4 44 76 181 0 1808 0.00% 48951.22 6166.71 9034.94
36% 35M 15239058 19 4 45 76 178 0 2003 0.00% 48734.26 6139.37 8994.9
37% 37M 15800585 18 3 41 66 229 0 2355 0.00% 50356.09 6343.68 9294.24
                           
Gin   1.9.2  16core16G                       
cpu 内存 Samples Average Median 90%Line 95%Line 99%Line Min Max Error% Throughput Received KB/Sec Send KB/Sec
36% 36M 15109143 19 6 44 71 175 0 3250 0.00% 48151.87 5877.91 8746.33
36% 40M 15255749 19 5 43 70 189 0 3079 0.00% 48762.53 5952.45 8857.25
36% 40M 15385401 18 4 42 66 227 0 2312 0.00% 49181.03 6003.54 8933.27

5. Router

1) 常规路由

  • 支持GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE 这几类请求方法
  • 支持HiJack\WebSocket\ServerFile三类特殊应用
  • 支持Any注册方式,默认兼容GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE方式
  • 支持通过配置开启默认添加HEAD方式
  • 支持注册Handler,以启用配置化
  • 支持检查请求与指定路由是否匹配
Router.GET(path string, handle HttpHandle)
Router.POST(path string, handle HttpHandle)
Router.HEAD(path string, handle HttpHandle)
Router.OPTIONS(path string, handle HttpHandle)
Router.PUT(path string, handle HttpHandle)
Router.PATCH(path string, handle HttpHandle)
Router.DELETE(path string, handle HttpHandle)
Router.HiJack(path string, handle HttpHandle)
Router.WebSocket(path string, handle HttpHandle)
Router.Any(path string, handle HttpHandle)
Router.RegisterRoute(routeMethod string, path string, handle HttpHandle)
Router.RegisterHandler(name string, handler HttpHandle)
Router.GetHandler(name string) (HttpHandle, bool)
Router.MatchPath(ctx Context, routePath string) bool

接受两个参数,一个是URI路径,另一个是 HttpHandle 类型,设定匹配到该路径时执行的方法;

2) static router

静态路由语法就是没有任何参数变量,pattern是一个固定的字符串。

package main

import (
    "github.com/devfeel/dotweb"
)

func main() {
    dotapp := dotweb.New()
    dotapp.HttpServer.GET("/hello", func(ctx dotweb.Context) error{
        return ctx.WriteString("hello world!")
    })
    dotapp.StartServer(80)
}

test: curl http://127.0.0.1/hello

3) parameter router

参数路由以冒号 : 后面跟一个字符串作为参数名称,可以通过 HttpContext的 GetRouterName 方法获取路由参数的值。

package main

import (
    "github.com/devfeel/dotweb"
)

func main() {
    dotapp := dotweb.New()
    dotapp.HttpServer.GET("/hello/:name", func(ctx dotweb.Context) error{
        return ctx.WriteString("hello " + ctx.GetRouterName("name"))
    })
    dotapp.HttpServer.GET("/news/:category/:newsid", func(ctx dotweb.Context) error{
    	category := ctx.GetRouterName("category")
	    newsid := ctx.GetRouterName("newsid")
        return ctx.WriteString("news info: category=" + category + " newsid=" + newsid)
    })
    dotapp.StartServer(80)
}

test:
curl http://127.0.0.1/hello/devfeel
curl http://127.0.0.1/hello/category1/1

4) group router

    g := server.Group("/user")
	g.GET("/", Index)
	g.GET("/profile", Profile)

test:
curl http://127.0.0.1/user
curl http://127.0.0.1/user/profile

6. Binder

  • HttpContext.Bind(interface{})
  • Support data from json、xml、Form
type UserInfo struct {
		UserName string `form:"user"`
		Sex      int    `form:"sex"`
}

func TestBind(ctx dotweb.HttpContext) error{
        user := new(UserInfo)
        if err := ctx.Bind(user); err != nil {
        	 return ctx.WriteString("err => " + err.Error())
        }else{
             return ctx.WriteString("TestBind " + fmt.Sprint(user))
        }
}

7. Middleware

Middleware

app.Use(NewAccessFmtLog("app"))

func InitRoute(server *dotweb.HttpServer) {
	server.GET("/", Index)
	server.GET("/use", Index).Use(NewAccessFmtLog("Router-use"))

	g := server.Group("/group").Use(NewAccessFmtLog("group"))
	g.GET("/", Index)
	g.GET("/use", Index).Use(NewAccessFmtLog("group-use"))
}

type AccessFmtLog struct {
	dotweb.BaseMiddlware
	Index string
}

func (m *AccessFmtLog) Handle(ctx dotweb.Context) error {
	fmt.Println(time.Now(), "[AccessFmtLog ", m.Index, "] begin request -> ", ctx.Request.RequestURI)
	err := m.Next(ctx)
	fmt.Println(time.Now(), "[AccessFmtLog ", m.Index, "] finish request ", err, " -> ", ctx.Request.RequestURI)
	return err
}

func NewAccessFmtLog(index string) *AccessFmtLog {
	return &AccessFmtLog{Index: index}
}

8. Server Config

HttpServer:

  • HttpServer.EnabledSession

    设置是否开启Session支持,目前支持runtime、redis两种模式,默认不开启

  • HttpServer.EnabledGzip

    设置是否开启Gzip支持,默认不开启

  • HttpServer.EnabledListDir

    设置是否启用目录浏览,仅对Router.ServerFile有效,若设置该项,则可以浏览目录文件,默认不开启

  • HttpServer.EnabledAutoHEAD

    设置是否自动启用Head路由,若设置该项,则会为除Websocket\HEAD外所有路由方式默认添加HEAD路由,非开发模式默认不开启

  • HttpServer.EnabledAutoOPTIONS

    设置是否自动启用Options路由,若设置该项,则会为除Websocket\HEAD外所有路由方式默认添加OPTIONS路由,非开发模式默认不开启

  • HttpServer.EnabledIgnoreFavicon

    设置是否忽略Favicon的请求,一般用于接口项目

  • HttpServer.EnabledDetailRequestData

    设置是否启用详细请求数据统计,默认为false,若设置该项,将启用ServerStateInfo中DetailRequestUrlData的统计

  • HttpServer.EnabledTLS

    设置是否启用TLS加密处理

  • HttpServer.EnabledIgnoreFavicon

    设置是否忽略favicon响应,默认为false,若设置该项,将会默认注册内集成的IgnoreFaviconModule,在路由生效前执行

  • HttpServer.EnabledBindUseJsonTag

    设置是否启用json tag生效于Bind接口,默认为false,若设置该项,将会在Bind执行时检查json tag

Run Mode

  • 新增development、production模式
  • 默认development,通过DotWeb.SetDevelopmentMode\DotWeb.SetProductionMode开启相关模式
  • 若设置development模式,未处理异常会输出异常详细信息,同时启用日志开关,同时启用日志console打印,同时自动启用AutoHead&AutoOptions
  • 未来会拓展更多运行模式的配置

9. Exception

500 error

  • Default: 当发生未处理异常时,会根据RunMode向页面输出默认错误信息或者具体异常信息,并返回 500 错误头
  • User-defined: 通过DotServer.SetExceptionHandle(handler *ExceptionHandle)实现自定义异常处理逻辑
type ExceptionHandle func(Context, error)

404 error

  • Default: 当发生404异常时,会默认使用http.NotFound处理
  • User-defined: 通过DotWeb.SetNotFoundHandle(handler NotFoundHandle)实现自定义404处理逻辑
type NotFoundHandle  func(http.ResponseWriter, *http.Request)

Dependency

websocket - golang.org/x/net/websocket
redis - github.com/garyburd/redigo
yaml - gopkg.in/yaml.v2

dependency now managed by go mod.

相关项目

LongWeb

项目简介:http长连接网关服务,提供Websocket及长轮询服务

yulibaozi.com

项目简介:基于dotweb与mapper的一款go的博客程序

Golang-Blog-Server

项目简介:基于dotweb的一款go的Blog(博客)服务端

TokenServer

项目简介:token服务,提供token一致性服务以及相关的全局ID生成服务等

Wechat-token

项目简介:微信Access Token中控服务器,用来统一管理各个公众号的access_token,提供统一的接口进行获取和自动刷新Access Token。

dotweb-start

项目简介:基于dotweb、dotlog、mapper、dottask、cache、database的综合项目模板。

Contact Us

QQ-Group:193409346 - Golang-Devfeel

Gitter:Gitter

Comments
  • dotweb & beego 不完全压力测试对比

    dotweb & beego 不完全压力测试对比

    ➜ src git:(master) ✗ wrk -c100 -t100 -d10s http://localhost:8081/dotweb Running 10s test @ http://localhost:8081/dotweb 100 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 3.46ms 2.85ms 52.47ms 72.87% Req/Sec 314.86 68.44 820.00 73.04% 315407 requests in 10.11s, 43.62MB read Requests/sec: 31211.64 Transfer/sec: 4.32MB

    ➜ src git:(master) ✗ wrk -c100 -t100 -d10s http://localhost:8080/beego Running 10s test @ http://localhost:8080/beego 100 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 5.18ms 6.09ms 90.41ms 89.80% Req/Sec 261.17 90.74 3.06k 80.98% 261108 requests in 10.10s, 38.85MB read Requests/sec: 25862.00 Transfer/sec: 3.85MB

    dotweb code: package main

    import ( "fmt"

    "github.com/devfeel/dotweb"
    

    )

    func main() { //初始化DotServer app := dotweb.New()

    //开启debug模式
    app.SetDevelopmentMode()
    
    //设置路由
    InitRoute(app.HttpServer)
    
    //开始服务
    port := 8081
    err := app.StartServer(port)
    fmt.Println("dotweb.StartServer error => ", err)
    

    }

    func Hello(ctx dotweb.Context) error { ctx.WriteString("hello world!") return nil }

    func InitRoute(server *dotweb.HttpServer) { server.Router().GET("/", Hello) server.Router().GET("/hello", Hello) server.Router().GET("/dotweb", Hello) }

    beego code:

    package main

    import ( "github.com/astaxie/beego" )

    type MainController struct { beego.Controller }

    func (c *MainController) Get() { c.Ctx.WriteString("Hello World!") }

    func main() { beego.Router("/", &MainController{}) beego.Router("/beego", &MainController{}) beego.Run() }

    opened by forging2012 3
  • 关于Module中间件的疑问

    关于Module中间件的疑问

    您好,我用Module来过滤未登录的用户,如果用户未登录则返回提示需要登录信息,End()表示提前中断请求,但是它会使我的OnEndRequest失效,它会在End()时就结束了Request,但是我在OnEndRequest里的一些操作就不会执行到,请问有什么方法可以让OnEndRequest也可以执行到呢?

    opened by BingboLI 3
  • CORS设置,对ServerFile无效

    CORS设置,对ServerFile无效

    想用dotweb搭建通用文件服务器,发现 app.Use(cors.DefaultMiddleware())
    这一句对 app.HttpServer.ServerFile无效,有时间请领导测试一下。谢谢。

    app := dotweb.New()
    app.Use(cors.DefaultMiddleware())
    rootPath ,_ := util.RootPath()
    app.HttpServer.ServerFile("/*filepath", rootPath)
    
    opened by dotqi 2
  • 能不能为静态目录专门增加一个设置路径的方法?

    能不能为静态目录专门增加一个设置路径的方法?

    1、app.HttpServer.ServerFile("/static/filepath", "static")能不能把星号后面的filepath去掉?因为星号就代表全部了。 2、最好能增加一个设置静态目录的方法,参数里面直接填写静态目录的路径即可(要支持相对路径),然后一个可选参数是数组形式,比如{".css","*.png"},用于指定允许的静态文件类型。

    opened by biij5698 2
  • 自定义处理异常的时候设置返回数据的content-type 但是没有生效

    自定义处理异常的时候设置返回数据的content-type 但是没有生效

    自定义处理异常的时候设置返回数据的content-type 但是没有生效 一直是Content-Type: text/plain; charset=utf-8,

    // 异常处理
    type M map[string]interface{}
    
    func ExceptionHandle(ctx dotweb.Context, err error) {
    	ctx.Response().SetContentType(dotweb.MIMEApplicationJSONCharsetUTF8)
    	ctx.WriteJsonC(http.StatusInternalServerError, M{"error": err.Error()})
    }
    
    app := dotweb.New()
    
    // 处理错误响应
    app.SetExceptionHandle(ExceptionHandle)
    
    opened by westoi 2
  • 【BUG】app.HttpServer.SetEnabledGzip(true)设置gzip压缩后,访问页面返回空压缩包直接下载

    【BUG】app.HttpServer.SetEnabledGzip(true)设置gzip压缩后,访问页面返回空压缩包直接下载

    测试代码:

    ` // FILENAME: dotweb-hello.go // DATE: 23/10/2017 // AUTHOR: [email protected] // Github: https://github.com/forging2012 // Description: dotweb-hello.go

    package main

    import ( "fmt"

    "github.com/devfeel/dotweb"
    

    )

    func main() { app := dotweb.New() app.SetDevelopmentMode()

    //app.Start()
    
    app.HttpServer.SetEnabledGzip(true)
    
    //InitRoute(app.HttpServer)
    app.HttpServer.Router().GET("/", Hello)
    
    port := 8080
    //app.StartServer(port)
    err := app.StartServer(port)
    if err != nil {
    	fmt.Println(err)
    }
    

    }

    func Hello(ctx dotweb.Context) error { ctx.WriteString("Hello world!") return nil } `

    opened by forging2012 2
  • can you create some type in ctx.Query...()

    can you create some type in ctx.Query...()

    hi, The author of the handsome,I am usering dotweb,it is beautiful,but i have some tips: i hope have ctx.QueryInt64()、ctx.QueryInt() and so on... but now I find ctx,QueryString() only.

                                                                                                                         Happy working!
    
    opened by imyuliz 2
  • 老哥,能否考虑增加context支持

    老哥,能否考虑增加context支持

    目前框架的超时需要自己在handle中处理,go1.7中加入的context包可以很好的处理超时后结束任务队列, 理想中的方式 func(ctx dotweb.Context){ ctx.glob["x"]//全局容器 ctx.settimeout=超时时间/time.after/超时chan ctx.settimeoutfunc .....do ....

    }

    opened by aiyox 2
  • Session在Redis存储模式下不支持MaxActive、MaxIdle等参数设置,默认设置在并发场景下导致Session读取为空

    Session在Redis存储模式下不支持MaxActive、MaxIdle等参数设置,默认设置在并发场景下导致Session读取为空

    Session在Redis存储模式下不支持自定义MaxActive、MaxIdle等参数设置, 默认MaxIdle=5,MaxActive=20,-->newPool函数,导致并发场景下Redis连接池耗尽,从而ctx.Session().Get("key"),获取有概率为nil,-->GetSessionState函数

    opened by mstmdev 1
  • SetMethodNotAllowedHandle时修改StatusCode无效

    SetMethodNotAllowedHandle时修改StatusCode无效

    App.SetMethodNotAllowedHandle(func(ctx dotweb.Context) { ctx.Redirect(301, "/") }) 当 设置SetMethodNotAllowedHandle时,系统并不能按预定的进行跳转。而是直接返回405错误。

    opened by dotqi 1
  • ServerFile不能正确获取SessionID()

    ServerFile不能正确获取SessionID()

    当ServerFile启用中间件功能时。中间件不能正确获取访问用户的SessionID()。

    需求:SESSION控制ServerFile访问权限。

    以下为测试代码。
    APP级别中间件,输出SESSIONID。
    访问/view路径时输出SESSIONID为空白。

    2019-01-26 16:29:18

    package main
    
    import (
    	"fmt"
    
    	"github.com/devfeel/dotweb"
    )
    
    func main() {
    	app := dotweb.New()
    	// 中间件
    	app.Use(NewSessionAuth())
    	// 开启SESSION
    	app.HttpServer.SetEnabledSession(true)
    	// 开启ServerFile中间件支持
    	app.HttpServer.SetEnabledStaticFileMiddleware(true)
    	app.HttpServer.SetEnabledListDir(true)
    	// 设置路由 输出字符串 Hello Dotweb
    	app.HttpServer.GET("/", func(ctx dotweb.Context) error {
    		method := ctx.Request().Method
    		return ctx.WriteString("Hello Dotweb\n" + "Method:" + method)
    	})
    	// 单独设置中间件
    	//app.HttpServer.ServerFile("/view/*", "D:/GoWork/GoTest/view").Use(NewSessionAuth())
    	// 使用APP级别中间件
    	app.HttpServer.ServerFile("/view/*", "D:/GoWork/GoTest/view")
    
    	//开启服务 端口号
    	fmt.Println("dotweb.StartServer => 8080")
    	err := app.StartServer(8080)
    	fmt.Println("dotweb.StartServer error => ", err)
    }
    
    // SessionAuth 结构体
    type SessionAuth struct {
    	dotweb.BaseMiddlware
    }
    
    // Handle 处理程序
    func (m *SessionAuth) Handle(ctx dotweb.Context) error {
    	fmt.Println(ctx.SessionID(), ctx.Request().RequestURI)
    	return m.Next(ctx)
    }
    
    // NewSessionAuth New
    func NewSessionAuth() *SessionAuth {
    	sAuth := new(SessionAuth)
    	return sAuth
    }
    
    opened by dotqi 1
  • 在路由组上注册跨域中间件时,复杂跨域请求会报CORS策略阻止错误。

    在路由组上注册跨域中间件时,复杂跨域请求会报CORS策略阻止错误。

    在路由组上注册跨域中间件时。如 iweb.HttpServer.Group("/api").Use(cors.New("")) 。 当进行简单跨域请求时一切正常。

    当进行复杂跨域请求时。用iweb.HttpServer.SetEnabledAutoOPTIONS(true)自动注册OPTIONS请求。会提示已被CORS策略阻止错误。 如果手动注册OPTIONS请求时一切正常。如 apiGroup.OPTIONS(”/app“, dotweb.DefaultAutoOPTIONSHandler)。

    opened by dotqi 0
  • url with trailingslah /hello/xxx/  match route  /hello/:name should return  404  not 301

    url with trailingslah /hello/xxx/ match route /hello/:name should return 404 not 301

    test.go

    package main
    
    import (
        "github.com/devfeel/dotweb"
    )
    
    func main() {
        dotapp := dotweb.New()
     
        dotapp.HttpServer.GET("/hello/:name", func(ctx dotweb.Context) error{
            return ctx.WriteString("hello " + ctx.GetRouterName("name"))
        })
     
        dotapp.StartServer(80)
    }
    

    $ curl http://localhost/hello/xx/ Moved Permanently.

    should return 404 like net/http example.go

    package main
    import (
        "fmt"
        "net/http"
    )
    func main() {
        http.HandleFunc("/hello/aa", func (w http.ResponseWriter, r *http.Request) {
            fmt.Fprintf(w, "Welcome to my website!")
        })
       http.ListenAndServe(":80", nil)
    }
    

    $ curl http://localhost/hello/xx/ 404 page not found

    opened by tablecell 1
  • 2019年新年快乐,感谢大家对dotweb的支持!

    2019年新年快乐,感谢大家对dotweb的支持!

    2019年新年快乐,感谢一路以来大家对dotweb的支持! 准备一份小礼物,大家可以在这个issue评论,新年之时抽取三位幸运者赠送dotweb千星纪念杯一份。

    新年抽奖程序已备好,请大家review: https://github.com/devfeel/dotweb-how-to/blob/master/lucky/main.go

    从github获取用户名单和评论代码: https://github.com/devfeel/dotweb-how-to/blob/master/lucky/queryuser/main.go

    opened by devfeel 92
Releases(v1.7.19)
  • v1.7.19(Apr 16, 2022)

    ####Version 1.7.19

    • feature: add SetReadTimeout\SetReadHeaderTimeout\SetIdleTimeoutSetWriteTimeout func() in HttpServer
    • 2021-04-20 13:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.18(Apr 20, 2021)

    ####Version 1.7.18

    • Bug fix: fix deepcopy middleware not success
    • 2021-04-20 13:00 at ShangHai

    ####Version 1.7.17

    • Bug fix: fix GetRandString return same result
    • 2021-01-29 08:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.16(Jan 25, 2021)

    ####Version 1.7.16

    • Bug fix: fix middleware chain misbehaving in netsed groups
    • Tips: for issue #234, thanks for @live's code
    • 2021-01-24 22:00 at ShangHai

    ####Version 1.7.15

    • Tips: replace *HttpContext to Context interface,used to implementation custom Context in dotweb
    • feature: add ContextCreater func() Context & HttpServer.SetContextCreater
    • refactor: update *HttpContext to Context interface in HttpServer & Middleware & Request
    • refactor: add defaultContextCreater used to create Context with HttpContext when HttpServer.ServeHTTP
    • example code: example/main.go
    • How to use SetContextCreater:
    // define
    type testContext struct {
    	dotweb.HttpContext
    	TestInfo string
    }
    
    func testContextCreater() dotweb.Context {
    	return &testContext{TestInfo:"Test"}
    }
    
    // set into dotweb
    app.HttpServer.SetContextCreater(testContextCreater)
    
    // use in router
    func OutputTestInfo(ctx dotweb.Context) error {
    	return ctx.WriteString(ctx.(*testContext).TestInfo)
    }
    
    • 2021-01-24 18:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.14(Dec 19, 2020)

    Version 1.7.14

    • fix: fixed can not set redis maxIdle & maxActive when use redis session, fix for issue #236
    • refactor: add StoreConfig.MaxIdle & StoreConfig.MaxActive set redis maxIdle & maxActive
    • refactor: add redisutil.GetDefaultRedisClient to returns the RedisClient of specified address
    • refactor: update redisutil.GetRedisClient returns the RedisClient of specified address & maxIdle & maxActive
    • opt: set defaultMaxIdle=10, defaultMaxActive=50 when use default redis config
    • How to set redis maxIdle & maxActive when use redis session:
    sessionConf := session.NewDefaultRedisConfig("redis://xx.xx.xx.xx:6379/0")
    sessionConf.BackupServerUrl = "redis://xx.xx.xx.xx:6379/0"
    sessionConf.CookieName = "dotweb-example.SessionID"
    sessionConf.MaxIdle = 20
    sessionConf.MaxActive = 100
    
    • 2020-12-19 21:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.13(Aug 11, 2020)

  • v1.7.12(Jun 3, 2020)

  • v1.7.11(May 10, 2020)

    Version 1.7.11

    • Feature: add Tools include some useful functions
    • Feature: add Tools.PrettyJson used to pretty json format view in text
    • Detail: use ctx.Tools() to use Tools
    • 2020-05-10 15:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.10(Dec 1, 2019)

    Version 1.7.10

    • Feature: add Request.ExistsQueryKey used to check is exists from query params with the given key.
    • Opt: optimize file layout, remove module.go
    • Opt: optimize core/htmx implementation
    • Opt: /dotweb/state/interval support pretty mode, you can visit like this: /dotweb/state/interval?pretty
    • 2019-12-01 15:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.9(Nov 19, 2019)

    Version 1.7.9

    • Opt: optimize html create code
    • Opt: optimize core.CreateTablePart\core.CreateTableHtml\core.CreateHtml
    • 2019-11-20 07:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.8(Nov 19, 2019)

    Version 1.7.8

    • Opt: optimize tree.go
    • Opt: Fix some panic information when a 'catch-all' wildcard conflict occurs.
    • Opt: use maxParamCount const instead of magic number.
    • Opt: optimize countParams.
    • Opt: optimize incrementChildPrio.
    • Opt: comment style fixes.
    • Opt: improve param name check.
    • Opt: fix maxParams bug.
    • 2019-11-19 12:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.7(Nov 12, 2019)

    Version 1.7.7

    • Opt: 优化系统路由dotweb/state、dotweb/routers展现方式,以方便阅读的表格形式输出
    • Feature: 新增core.TableHtml\core.CreateTableHtml()用于生成相关Html代码
    • About:
      • 可访问dotweb/state查看当前实例运行时信息
      • 可访问dotweb/routers查看当前实例注册的所有路由信息
    • 2019-11-12 18:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.6(Nov 9, 2019)

    Version 1.7.6

    • Fix: 修复在调用SetMethodNotAllowedHandle时修改StatusCode无效问题
    • Opt: 将路由阶段设置405代码逻辑移除,相关逻辑在DefaultMethodNotAllowedHandler实现
    • About MethodNotAllowedHandle:
      • 默认使用DefaultMethodNotAllowedHandler
      • 如调用SetMethodNotAllowedHandle,则使用用户代码覆盖DefaultMethodNotAllowedHandler
    • How to use SetMethodNotAllowedHandle:
    app.SetMethodNotAllowedHandle(func(ctx dotweb.Context){
        ctx.Redirect(301, "/")
    })
    
    • 2019-11-10 00:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.5(Nov 6, 2019)

    Version 1.7.5

    • Feature: Router增加RegisterHandlerFunc,用于支持注册go原生http.HandlerFunc形式的函数
    • Feature: HttpServer增加RegisterHandlerFunc与RegisterRoute
    • Opt: Router增加transferHandlerFunc、transferStaticFileHandler辅助函数
    • Example: 修改example/router增加RegisterHandlerFunc示例
    • About RegisterHandlerFunc
      • Func: RegisterHandlerFunc(routeMethod string, path string, handler http.HandlerFunc) RouterNode
    • How to use RegisterHandlerFunc:
    func HandlerFunc(w http.ResponseWriter, r *http.Request){
    	w.Write([]byte("go raw http func"))
    }
    
    server.RegisterHandlerFunc("GET", "/h/func", HandlerFunc)
    
    • 2019-11-07 01:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.4(Nov 3, 2019)

    Version 1.7.4

    • New Feature: HttpServer.RegisterServerFile增加excludeExtension参数,用于设置不希望被访问的文件后缀名
    • Update: 增加ErrNotFound
    • About HttpServer.RegisterServerFile:
      • Demo: server.RegisterServerFile(RouteMethod_GET, "/src/*", "/var/www", nil)
      • Demo: server.RegisterServerFile(RouteMethod_GET, "/src/*filepath", "/var/www", []string{".zip", ".rar"})
      • 当设置excludeExtension为nil时,可访问所有文件
      • 本次更新涉及API变更
    • Fixed for issue #125 & #212
    • 2019-11-04 01:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.3(Oct 29, 2019)

    Version 1.7.3

    • New Feature: Request.PostBody增加Post内容大小限制,默认为32mb
    • About MaxBodySize:
      • 通过app.HttpServer.SetMaxBodySize设置
      • 默认为 32 << 20 (32 mb)
      • -1 : unlimted
      • 0 : use default value
      • other: use other value
    • 感谢 @wziww 提供 PR
    • 2019-10-29 12:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(Oct 23, 2019)

    Version 1.7.2

    • Bug Fixed: Request.Release()增加对realUrl的处理
    • 2019-10-23 12:00 at ShangHai

    Version 1.7.1

    • New Feature: 新增stringx.CompletionRight\CompletionLeft,用于指定长度两侧补齐字符串
    • Update: 完善dotweb/routers系统页,输出method+router格式,类似:"GET /dotweb/routers"
    • 2019-07-27 08:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • 1.7.0(Jul 22, 2019)

    Version 1.7.0

    • New Feature: 新增NotifyPlugin插件,默认集成监控配置文件变化热重启
    • New Feature: 新增DotWeb.ReSetConfig用于运行时重载配置
    • About NotifyPlugin:
      • 通过NewDefaultNotifyPlugin创建默认集成的NotifyPlugin
      • 仅当Dotweb通过配置文件启动方式下有效,监测默认的配置文件
      • 当热重启配置文件时,Dotweb本身监听端口以及pprod设置不会重载
      • 感谢@地蛋对该插件的支持
    • 2019-07-22 14:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • 1.6.9(Jul 12, 2019)

    Version 1.6.9

    • New Feature: 增加插件机制-Plugin,随App启动一起执行,不会阻塞App启动过程,如需持续运行,在Plugin的Run中自行处理即可。
    • Architecture: 修正BaseMiddlware命名错误,增加BaseMiddleware,保留BaseMiddlware至2.0版本前
    • About Plugin:
      • 通过dotweb.UsePlugin注册插件
      • 自定义插件需事先Plugin接口
      • 即将发布集成插件 - 监控配置文件变化热重启插件
    • 2019-07-12 12:00 at ShangHai
    Source code(tar.gz)
    Source code(zip)
  • v1.6.8(Jun 29, 2019)

    Version 1.6.8

    • Architecture: Remove OfflineServer
    • Example: Remove render\developmode\start examples
    • Bug fix: update latest tag to v1.6.8 for go modules
    • About examples:
      • You can visit https://github.com/devfeel/dotweb-example to know more examples for dotweb.
    • 2019-06-29 21:00 at ShangHai.Home
    Source code(tar.gz)
    Source code(zip)
  • v1.6.7(Jun 29, 2019)

  • 1.6.6(Jun 29, 2019)

    Version 1.6.6

    • New Feature: Add AccessLog middleware for logging HTTP requests in the Apache Common Log Format.
    • New Feature: Add Raw() in dotweb.Logger
    • About AccessLog:
      • implement the Apache Common Log Format
      • log file name like "dotweb_accesslog_2017_06_09.log"
      • log-example: 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
    • How to use AccessLog middleware:
        app.Use(accesslog.Middleware())
        server.GET("/", Index).Use(accesslog.Middleware())
    
    • 2019-06-27 23:00 at 深圳华安大酒店

    Version 1.6.5

    • Architecture: move core.GlobalState to dotweb.StateInfo()
    • Architecture: add HttpServer.StateInfo() who is a shortcut for DotWeb.StateInfo()
    • Remove: remove unused property valueNodePool in router
    • About dotweb.StateInfo:
      • you can use ctx.HttpServer().StateInfo() to get this object
      • you can visit /virtualPath/dotweb/state to list all state info
    • 2019-06-26 08:00

    Version 1.6.4

    • Architecture: add dotweb_sysgroup.go to implement IncludeDotwebGroup
    • New Feature: add /virtualPath/dotweb/routers to list all router express
    • New Feature: add Router.GetAllRouterExpress to return router.allRouterExpress
    • Bug Fixed: update example on dotweb version 1.6.4
    • About dotweb.IncludeDotwebGroup:
      • if use dotweb.New(), in default it will not call IncludeDotwebGroup
      • if use dotweb.Classic(), in default it will call IncludeDotwebGroup
    • 2019-06-22 16:00

    Version 1.6.3

    • Architecture: move logger.Logger() to DotWeb.Logger()
    • Architecture: add HttpServer.Logger who is a shortcut for DotWeb.Logger()
    • Architecture: remove logger.Logger()
    • How to use dotweb.Logger in your app:
      func TestLog(ctx dotweb.Context) error {
      	ctx.HttpServer().Logger().Info(dotweb.LogTarget_Default, "test log")
      	return ctx.WriteString("log page")
      }
      
    • 2019-06-13 12:00

    Version 1.6.2

    • Bug fixed: cryptos.GetRandString used to returns randominzed string with given length
    • Detail:
      • default character set is "0123456789abcdefghijklmnopqrstuvwxyz"
    • Demo:
      func main() {
          fmt.Println(cryptos.GetRandString(10))
      }
      
    • 2019-02-20 14:00

    Version 1.6.1

    • New Feature: RouterNode add RouterNode.Path() to get routing path for the request
    • Detail:
      • you can use ctx.RouterNode().Path() to get routing path for the request
      • you can use ctx.HttpServer().Router().MatchPath to match request and routing path
    • Demo:
      func main() {
      	app := dotweb.Classic("/home/logs/wwwroot/")
      
        // if use this, all router will auto add "HEAD" method support
        // default is false
        app.HttpServer.SetEnabledAutoHEAD(true)
      
      	app.HttpServer.GET("/index", func(ctx dotweb.Context) error{
      	    flag := ctx.HttpServer().Router().MatchPath(ctx, "/index")
      		return ctx.WriteString("welcome to my first web!" + ctx.RouterNode().Path() + " - " + fmt.Sprint(flag))
      	})
      
      	err := app.StartServer(80)
          fmt.Println("dotweb.StartServer error => ", err)
      }
      
    • 2019-02-12 16:00
    Source code(tar.gz)
    Source code(zip)
  • 1.6(Feb 2, 2019)

    【dotweb百版大战】 - https://github.com/devfeel/dotweb 正临新年之际,dotweb百版大战捷报传来!自创立以来,顺利完成100个版本的发布,感谢各位。 版本正式升级为1.6!

    Version 1.6

    • New Feature: HttpServer add SetIndexPage used to config default index-page name, default is "index.html"
    • New Feature: Fix UT and add scripts for UT
    • New Feature: Add IDGenerate define the handler for create Unique Id
    • New Feature: Add dotweb.DefaultUniqueIDGenerater which is default generater used to create Unique Id
    • New Feature: HttpServer & Router add RegisterServerFile use to register ServerFile router with routeMethod method on http.FileServer
    • Fixed Bug: Request.IsAJAX check X-Requested-With Contains XMLHttpRequest
    • New Feature: Add Request.RealIP used to returns the first ip from 'X-Forwarded-For' or 'X-Real-IP' header key, fixed for #164
    • New Feature: route.ServerFile support 'filepath' or '/', to simplify register static file router, fixed for #125
    • New Feature: Response support http2 Push
    • Fix typo and translate Chinse to English
    • Translate Chinse to English
    • Fix UT in cache/runtime
    • Remove invalid lock in cache/runtime
    • Update: ServerFile add support for EnabledAutoHEAD\EnabledAutoOPTIONS
    • Update: Add "GlobalUniqueID : XXXXXXXXXXXXXXXXXXX" on state page, you can view "host/dotweb/state"
    • Enabled AutoOPTIONS\AutoHEAD flag when app is on RunMode_Development mode
    • Remove: remove all features in dotweb!
    • Remove: remove ServerConfig().EnabledAutoCORS.
    • Add: add example/README.md
    • Fix Bug for #184 ServerFile不能正确获取SessionID()
    • Fix Bug for HttpServer.EnabledAutoOPTIONS, use DefaultAutoOPTIONSHandler replace user-handler to bind auto-options router
    • Fixed Bug: Request.IsAJAX check X-Requested-With Contains XMLHttpRequest

    dotweb的每一小步成长,离不开大家的帮助,感谢。 https://github.com/devfeel/dotweb

    Source code(tar.gz)
    Source code(zip)
  • 1.5.7(Aug 22, 2018)

    Version 1.5.7

    • New Feature: Add integration Timeout Middleware, support DotWeb.UseTimeoutHook to use it
    • Detail:
      • Provide DefaultTimeoutHookHandler to simplify use, it will auto write log the req info which time out
    • Example:
      app.UseTimeoutHook(dotweb.DefaultTimeoutHookHandler, time.Second * 2)
      
    • New Feature: Add Mock module, support DotWeb.SetMock to use it
    • Detail:
      • Provide StandardMock to simplify use, it implement Mock interface
      • also you can create custom implement
      • you can register MockHandle or register return string
      • register key only support route
      • special: mock mode only effective in DevelopMode
    • Example:
      func AppMock() dotweb.Mock{
      	m := dotweb.NewStandardMock()
      	m.RegisterString("/", "mock data")
      	return m
      }
      app.SetMock(AppMock())
      
    • 2018-08-22 10:00
    Source code(tar.gz)
    Source code(zip)
  • 1.5.6(Aug 18, 2018)

    Version 1.5.6.1

    • BugFixed: hystrix add doCleanHistoryCounter, used to clean history counter
    • 2018-08-18 10:00

    Version 1.5.6

    • New feature: add hystrix module, now is used to auto switch to backup redis session store
    • New feature: Session.StoreConfig support BackupServerUrl, used to store session when default ServerIP redis is not available
    • Detail:
      • hystrix default MaxFailedNumber is 20 per 2 minutes
    • Example:
      sessionConf := session.NewDefaultRedisConfig("redis://10.10.0.1:6322/1")
      sessionConf.BackupServerUrl = "redis://10.10.0.1:6379/1"
      
    • 2018-08-17 15:00

    Version 1.5.5

    • New feature: /dotweb/state add CurrentRequestCount data
    • Update: improve 30% performance on app's metric
    • 2018-08-09 15:00

    Version 1.5.4

    • New feature: Session.StoreConfig support CookieName, used to set custom cookie name which sessionid store, default is dotweb_sessionId
    • Update: Config.SessionNode add CookieName, used to set custom cookie name which sessionid store
    • Update: default log format update to "Time [LogLevel] [FileName:Line] Content"
    • BugFixed: remove init session which exec on dotweb.initAppConfig
    • 2018-08-02 15:00

    Version 1.5.3

    • New feature: HttpServer add Validator which be called by Context.Validate()
    • New feature: Context add Validate(interface{}) used to validate data with HttpServer::Validator
    • Update: use routerExpressSplit replace "_" when padding data to Router::RouterExpress
    • 2018-07-12 12:00

    Version 1.5.2

    • New feature: dotweb.innerRenderer add cache mode, default is enabled
    • New feature: dotweb.innerRenderer add NewInnerRendererNoCache() used to disabled cache
    • Update for app run_mode: if it's develop run mode, the default renderer will use no cache mode
    • 2018-06-22 14:00

    Version 1.5.1

    • Fixed Bug: double sprintf on logger.xlog
    • 2018-06-15 14:00
    Source code(tar.gz)
    Source code(zip)
  • 1.5.0(Aug 2, 2018)

    What's new?

    重要:go版本适配升级为1.9+

    New features:

    • New feature:UploadFile.RandomFileName used to get random file name from uuid
    • New feature: encodes.base64x used to quickly use base64 EncodeString and DecodeString
    • New feature: session.NewRedisConfig use to create redis session config include serverUrl and storeKeyPre
    • if you set custom storeKeyPre, it will be store key start with custom set, default is "dotweb:session:"
    • New feature: framewrok.RedisClient add Ping(), to check redis is alived
    • New feature: DevelopmentMode:default UseLog,default use RequestLogMiddleware,default Console Print
    • New feature: 状态页:访问/dotweb/state时增加CurrentTime字段输出
    • New feature: GetSessionStore add Redis Ping check,if not alived, it will be panic error
    • New feature: add dotweb.ClassicWithConf(config *config.Config),support Start server with custom config
    • New feature:完善RedisClient接口能力

    Bug fixed:

    • fixed: for #114 dotweb: fix error found by vet
    • fixed: for #122 - dotweb没有打出 access log
    • fixed: 修正Reponse自动释放时未重置body字段,导致内存溢出BUG
    • fixed: for #112 自定义处理异常的时候设置返回数据的content-type 但是没有生效

    调整:

    • 合并const目录内容至consts文件,统一const定义文件
    • 移除example/static
    • 新增example/developmode,便于对developmode的理解
    • 调整: dotweb.Classic移除自动UseRequestLog逻辑
    • 调整:Session Redis模式时,新增sessionReExpire用于重置有效期,避免调用SessionUpdate导致不必要的redis数据交换
    • 调整:Cache.Runtime调整map为sync.Map
    • 调整:Session Redis模式时,gob.EncodeMap逻辑调整,移除自动注册interface{}
    • 调整:UploadFile.Size实现方法,直接返回Header.Size数据
    • 调整:dotweb.Classic签名为Classic(logPath string),若传入logPath为空,则默认以"bin-root/logs"为日志目录
    • 调整:默认Log目录由"bin-root"为"bin-root/logs"
    • 调整:CharsetUTF8值为"charset=utf-8"
    • 调整:内置Vendor目录仅保留 golang.org/x/net包,移除redis与yaml包
    Source code(tar.gz)
    Source code(zip)
  • 1.4.8(Jan 26, 2018)

    Version 1.4.8

    • 调整:ItemContext更名为ItemMap,新增ConcurrenceMap、ReadonlyMap接口
    • 调整:Dotweb.AppContext变更为Dotweb.Items
    • 调整:HttpContext.AppContext变更为HttpContext.AppItems
    • 调整:HttpContext.AppSetConfig变更为HttpContext.ConfigSet
    • 调整:config.AppSet变更为config.ConfigSet
    • 新增: config.ParseConfigSetXML\ParseConfigSetJSON\ParseConfigSetYaml,用于解析常规Key\Value格式的配置文件
    • 新增:config.Config.IncludeConfigSet,用于向config.ConfigSet中导入Key\Value格式的配置文件,通过HttpContext.ConfigSet获取相关设置信息
    • ParseConfigSetXML:支持xml格式文件解析,返回core.ConcurrenceMap
    • ParseConfigSetJSON:支持json格式文件解析,返回core.ConcurrenceMap
    • ParseConfigSetYaml:支持yaml格式文件解析,返回core.ConcurrenceMap
    • 具体配置文件格式可参考example/configset
    • 新增示例代码 example/configset
    • 2018-01-24 22:00
    Source code(tar.gz)
    Source code(zip)
  • 1.4.7(Jan 26, 2018)

    Version 1.4.7

    • BUG Fixed: 修复Middleware特定场景下无效问题
    • 新增dotweb.IncludeDotwebGroup,用于自动集成dotweb相关路由
    • /dotweb/state 增加 ServerVersion输出
    • 2018-01-22 22:00
    Source code(tar.gz)
    Source code(zip)
  • 1.4.6(Jan 22, 2018)

    Version 1.4.6

    • BUG Fixed: UploadFile废弃Bytes接口,新增ReadBytes接口,用于返回上传文件本身
    • 需要特别注意,由于io.read具有一次性特性,UploadFile.SaveFile与UploadFile.ReadBytes只能使用其中一个,另外一个将无法正常获取数据
    • 增加dotweb.Version,用于输出框架版本号
    • 2018-01-21 09:00
    Source code(tar.gz)
    Source code(zip)
  • 1.4.5(Jan 22, 2018)

    Version 1.4.5

    • 新增yaml格式配置文件支持,具体参考 example/config/dotweb.yaml
    • config新增UnmarshalYaml\MarshalYaml\MarshalYamlString,提供针对Yaml的常规处理
    • config新增UnmarshalXML\MarshalXML\MarshalXMLString,提供针对Xml的常规处理
    • config新增UnmarshalJSON\MarshalJSON\MarshalJSONString,提供针对Json的常规处理
    • UploadFile新增Bytes接口,用于返回上传文件本身
    • 完善 example/config
    • 移除 example/session,查看更多示例,请移步https://github.com/devfeel/dotweb-example
    • 2018-01-20 23:40
    Source code(tar.gz)
    Source code(zip)
  • 1.4.4(Jan 10, 2018)

    Version 1.4.4

    • 调整Bind模块内部获取req.Body为HttpContext.PostBody,避免因为Bind后无法再次获取Post内容
    • 完善debug log 输出
    • 更新example/static, 该示例目前为实现一个纯静态文件服务器功能
    • 2018-01-08 12:00
    Source code(tar.gz)
    Source code(zip)
Owner
devfeel
Step by step for last success.
devfeel
Golanger Web Framework is a lightweight framework for writing web applications in Go.

/* Copyright 2013 Golanger.com. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except

golanger 298 Nov 14, 2022
The jin is a simplified version of the gin web framework that can help you quickly understand the core principles of a web framework.

jin About The jin is a simplified version of the gin web framework that can help you quickly understand the core principles of a web framework. If thi

null 8 Jul 14, 2022
⚡ Rux is an simple and fast web framework. support middleware, compatible http.Handler interface. 简单且快速的 Go web 框架,支持中间件,兼容 http.Handler 接口

Rux Simple and fast web framework for build golang HTTP applications. NOTICE: v1.3.x is not fully compatible with v1.2.x version Fast route match, sup

Gookit 84 Dec 8, 2022
lazy-go is an easy-to-use WEB framework.

lazy-go lazy-go is an easy-to-use WEB framework. Installation Run the following command under your project: go get -u github.com/NICEXAI/lazy-go Quick

Afeyer 3 Mar 25, 2022
Roche is a Code Generator and Web Framework, makes web development super concise with Go, CleanArch

It is still under development, so please do not use it. We plan to release v.1.0.0 in the summer. roche is a web framework optimized for microservice

Riita 14 Sep 19, 2022
A powerful go web framework for highly scalable and resource efficient web application

webfr A powerful go web framework for highly scalable and resource efficient web application Installation: go get -u github.com/krishpranav/webfr Exa

Krisna Pranav 13 Nov 28, 2021
A powerful go web framework for highly scalable and resource efficient web application

A powerful go web framework for highly scalable and resource efficient web application

null 22 Oct 3, 2022
Go-microzipkin-wrapHandler - A instance of go-micro with zipkin and WrapHandler

#zipkin tracing & Wrapper This is an example of how to integrate zipkin use wrap

MarsLuo 2 Apr 26, 2022
A web app built using Go Buffalo web framework

Welcome to Buffalo Thank you for choosing Buffalo for your web development needs. Database Setup It looks like you chose to set up your application us

Mike Okoth 0 Feb 7, 2022
Simple and lightweight Go web framework inspired by koa

VOX A golang web framework for humans, inspired by Koa heavily. Getting started Installation Using the go get power: $ go get -u github.com/aisk/vox B

An Long 79 Dec 14, 2022
An efficient, extensible and easy-to-use RPC framework.

eRPC eRPC is an efficient, extensible and easy-to-use RPC framework. Suitable for RPC, Microservice, Peer-to-Peer, IM, Game and other fields. 简体中文 Ins

henrylee2cn 2.4k Dec 29, 2022
BANjO is a simple web framework written in Go (golang)

BANjO banjo it's a simple web framework for building simple web applications Install $ go get github.com/nsheremet/banjo Example Usage Simple Web App

Nazarii Sheremet 20 Sep 27, 2022
Simple web framework for go, still quite beta at this point

WFDR Framework - Beta Release New 18/Feb/2012: Updated for go 1.0, new directory layout to take advantage of the go build tool. Background There's a m

null 23 Feb 11, 2021
High performance, simple Go web framework

Elton Elton的实现参考了koa以及echo,中间件的调整均为洋葱模型:请求由外至内,响应由内至外。主要特性如下: 处理函数(中间件)均以返回error的形式响应出错,方便使用统一的出错处理中间件将出错统一转换为对应的输出(JSON),并根据出错的类型等生成各类统计分析 成功响应数据直接赋值

Tree Xie 63 Dec 17, 2022
A gin-like simple golang web framework.

webgo A gin-like simple golang web framework.

vincent 1 Aug 24, 2022
A gin-like simple golang web framework.

A gin-like simple golang web framework.

vincent-言益 1 Aug 24, 2022
Easy-to-use web fuzzer, written in Go.

Brutal A lightweight, simple to use web fuzzer. Usage Brutal is pretty easy to use. Command Description --debug print more details about the runtime -

Andrew 4 Jul 8, 2022
Gerasimos (Makis) Maropoulos 23.4k Dec 28, 2022