這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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格式資料的解析以及檔案處理的樣本:
- Get
- Post
- Put
- Delete [暫時沒有樣本]
- JsonBody
- 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