gweb总结之开篇

yeqown · · 679 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
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格式数据的解析以及文件处理的示例:

  1. Get
  2. Post
  3. Put
  4. Delete [暂时没有示例]
  5. JsonBody
  6. Files

后续

我会在最近放上gweb的各个模块如:

  • router/middleware/* & router/router 实现了统一解析,校验和响应的模块,也是最重要的部分
  • models 基本上就是orm的使用
  • mainC/servers Http Server & Rpc Server
  • controller 业务逻辑的的处理函数
  • logger 自带的web logger
  • sh/Makefile 通过Makefile来打包部署golang程序

欢迎fork

github.com/yeqown/gweb

本文来自:Segmentfault

感谢作者:yeqown

查看原文:gweb总结之开篇

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

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