gweb
并不是一个web框架,而是自己整理的web脚手架?也不知道怎么称呼更为合适,因此主要目的在于总结相关知识。其中用到了的第三方的包,可以在项目的
vendor
文件夹里查阅。我也希望做成一个web框架,一边总结一边朝着这个方向迈进吧。
项目背景
最开始我一直都在用Python
在写web服务,至于python写代码是种什么体验,大家各有体会,当你习惯了使用python的表单解析校验方式,再使用Golang来进行同样的操作,对于刚开始接触Golang的程序猿来说,简直从天堂掉到了地狱。当然前提是,优雅的进行表单校验。而不是像下面的例子:
func Foo(w http.ResponseWriter req *http.Request) {
req.ParseForm()
bar := req.FormValue("bar")
if bar == "" {
// do some work
io.WriteString(w, "param invalid")
}
}
上面只是简单举个例子(手写代码,有错请原谅)。
所以我们想要的是:只需要写业务逻辑,定义表单和响应体。其他的工作让给另外的模块来统一处理。这里贴出最终的效果:
// 定义表单
type HelloGetForm struct {
Name string `schema:"name" valid:"Required" json:"name"`
Age int `schema:"age" valid:"Required;Min(18)" json:"age"`
}
var PoolHelloGetForm = &sync.Pool{New: func() interface{} { return &HelloGetForm{} }}
// 定义响应体
type HelloGetResp struct {
CodeInfo
Tip string `json:"tip"`
}
var PoolHelloGetResp = &sync.Pool{New: func() interface{} { return &HelloGetResp{} }}
// 业务逻辑处理
func HelloGet(req *HelloGetForm) *HelloGetResp {
resp := PoolHelloGetResp.Get().(*HelloGetResp)
defer PoolHelloGetResp.Put(resp)
resp.Tip = fmt.Sprintf("Get Hello, %s! your age[%d] is valid to access", req.Name, req.Age)
// TODO: sleep over 10 *time.Second, test Response TimeOut
time.Sleep(10 * time.Second)
Response(resp, NewCodeInfo(CodeOk, ""))
return resp
}
正式开篇
先贴上来用法demo,其中包含了Restful API的Method,还有Json格式数据的解析以及文件处理的示例:
后续
我会在最近放上gweb
的各个模块如:
- router/middleware/* & router/router 实现了统一解析,校验和响应的模块,也是最重要的部分
- models 基本上就是orm的使用
- mainC/servers Http Server & Rpc Server
- controller 业务逻辑的的处理函数
- logger 自带的web logger
- sh/Makefile 通过Makefile来打包部署golang程序