一個go的web項目框架(腳手架)廓八,可以讓你3分鐘內建立自己可用的Go Web項目

GIN-BOOT

介紹

這是一個go的web項目框架(腳手架),可以讓你3分鐘內建立自己可用的Go Web項目窿冯。

功能描述

http請求入?yún)⒖梢宰詣犹畛涞浇Y構體骗奖,如果是POST,則將http body數(shù)據(jù)填充到結構體醒串; 如果是GET执桌,則將URL query參數(shù)自動填充到結構體;

返回數(shù)據(jù)厦凤,可以是任意數(shù)據(jù)類型鼻吮。如果數(shù)據(jù)不是boot.ApiResp,則返回數(shù)據(jù)會被包裝為boot.ApiResp的json數(shù)據(jù)较鼓;

統(tǒng)一全局異常,請求返回會被包裝為系統(tǒng)異常

返回json格式

{

? ? "code":"100200",

? ? "msg":"成功",?

? ? "data":null?

}

使用demo

package main

import (

? ? "errors"

? ? "github.com/gin-gonic/gin"

? ? "github.com/xiaojun207/gin-boot/boot"

? ? "log"

? ? "net/http"

)

type Foo struct {

? ? Username string `json:"username" form:"username" binding:"required"`

? ? Password string `json:"password" form:"password"`

}

type Page struct {

? ? boot.BindQuery? ? // 繼承boot.BindQuery的結構體违柏,指定綁定到url參數(shù)

? ? PageNum? ? ? ? int `json:"page_num" form:"page_num"`? // url 中的參數(shù)博烂,需要用tag 'form' 標識,才能自動綁定

? ? PageSize? ? ? int `json:"page_size" form:"page_size"` // url 中的參數(shù)漱竖,需要用tag 'form' 標識禽篱,才能自動綁定

}

type QueryHeader struct {

? ? boot.BindHeader

? ? Authorization string `header:"authorization"`

}

// /testPost

// 入?yún)⒖梢宰詣犹畛涞浇Y構體,如果是POST,則將http body數(shù)據(jù)填充到結構體馍惹;

// 返回數(shù)據(jù)躺率,可以是任意數(shù)據(jù)類型。如果數(shù)據(jù)不是boot.ApiResp万矾,則返回數(shù)據(jù)會被包裝為boot.ApiResp的json數(shù)據(jù)悼吱;<br>

// 如果handler執(zhí)行異常,請求返回會被包裝為系統(tǒng)異常

// 參數(shù)page繼承boot.BindQuery的結構體良狈,綁定url參數(shù)

func TestPost1Handler(c *gin.Context, req *Foo, page Page, header QueryHeader) boot.ApiResp {

? ? log.Println("TestPost1Handler.req:", req.Username, ",Password:", req.Password)

? ? log.Println("TestPost1Handler.page.PageNum:", page.PageNum, ",PageSize:", page.PageSize)

? ? log.Println("TestPost1Handler.Authorization:", header.Authorization)

? ? return boot.ApiResp{Code: "100200", Msg: "Success", Data: "TestData: " + req.Username}

}

// /testGetEmpty

// 空返回值包裝測試后添,返回:{"code":"100200","data":null,"msg":"成功"}

func TestGetEmptyHandler(c *gin.Context, req *Foo) {

? ? log.Println("TestGetEmptyHandler.req.username:", req.Username, ",password:", req.Password)

}

// 空返回值包裝測試,返回:{"code":"100200","data":null,"msg":"成功"}

func TestGetHandler(c *gin.Context, page Page, header QueryHeader) {

? ? log.Println("TestGetHandler.page.PageNum:", page.PageNum, ",PageSize:", page.PageSize)

? ? log.Println("TestGetHandler.Authorization:", header.Authorization)

? ? log.Println("TestGetHandler")

}

// 異常全局處理測試薪丁,返回:{"code":"100101","data":null,"msg":"TestPost2Handler.TestError"}

func TestPost2Handler(c *gin.Context, req *Foo) {

? ? log.Println("TestPost2Handler.req.username:", req.Username, ",password:", req.Password)

? ? panic(errors.New("TestPost2Handler.TestError"))

}

// /testGet?username=admin12&password=1234&page_num=1&page_size=10

// url 中的參數(shù)遇西,需要用tag 'form' 標識

// 也可以使用gin方法, GET類型的請求,query參數(shù)也可以自動裝填到結構體

func TestGet1Handler(c *gin.Context, req *Foo, page Page) interface{} {

? ? log.Println("TestGet1Handler.req.username:", req.Username, ",password:", req.Password)

? ? log.Println("TestGet1Handler.page.PageNum:", page.PageNum, ",PageSize:", page.PageSize)

? ? data := map[string]interface{}{

? ? ? ? "list": []*Foo{req},

? ? ? ? "page": page,

? ? }

? ? log.Println("TestGet1Handler.data:", data)

? ? return data

}

func AuthInterceptor(c *gin.Context, header http.Header) {

? ? authorization := c.GetHeader("authorization")

? ? log.Println("AuthInterceptor.authorization:", authorization)

? ? if authorization == "" {

? ? ? ? log.Println("AuthInterceptor authorization is null")

? ? ? ? boot.Resp(c, "105101", "賬戶未登錄", "")

? ? ? ? c.Abort()

? ? ? ? return

? ? }

? ? //TODO getUid By authorization

? ? id := 100

? ? c.Set("uid", id)

}

var webRouter = func(router *boot.WebRouter) {

? ? //router.Use(AuthInterceptor)

? ? // 靜態(tài)資源

? ? router.StaticFile("/", "./views/index.html")

? ? router.StaticFS("/static/", http.Dir("./views/static/"))

? ? // 動態(tài)API

? ? router.POST("/testPost", AuthInterceptor, TestPost1Handler)

? ? router.POST("/testPost2", TestPost2Handler)

? ? router.GET("/testGetEmpty", TestGetEmptyHandler)

? ? router.GET("/testGet", TestGetHandler)

? ? router.GET("/testGet1", AuthInterceptor, TestGet1Handler)

? ? apiRouter := router.Group("/api/")

? ? apiRouter.GET("/test", TestPost2Handler)

}

func main() {

? ? boot.Start("8088", "/", webRouter)

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末严嗜,一起剝皮案震驚了整個濱河市粱檀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漫玄,老刑警劉巖茄蚯,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡第队,警方通過查閱死者的電腦和手機哮塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凳谦,“玉大人忆畅,你說我怎么就攤上這事∈矗” “怎么了家凯?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長如失。 經(jīng)常有香客問我绊诲,道長,這世上最難降的妖魔是什么褪贵? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任掂之,我火速辦了婚禮,結果婚禮上脆丁,老公的妹妹穿的比我還像新娘世舰。我一直安慰自己,他們只是感情好槽卫,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布跟压。 她就那樣靜靜地躺著,像睡著了一般歼培。 火紅的嫁衣襯著肌膚如雪震蒋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天躲庄,我揣著相機與錄音查剖,去河邊找鬼。 笑死读跷,一個胖子當著我的面吹牛梗搅,可吹牛的內容都是我干的。 我是一名探鬼主播效览,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼无切,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丐枉?” 一聲冷哼從身側響起哆键,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘦锹,沒想到半個月后籍嘹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闪盔,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年辱士,在試婚紗的時候發(fā)現(xiàn)自己被綠了泪掀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡颂碘,死狀恐怖异赫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情头岔,我是刑警寧澤塔拳,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站峡竣,受9級特大地震影響靠抑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜适掰,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一颂碧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧类浪,春花似錦稚伍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锈嫩。三九已至受楼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呼寸,已是汗流浹背艳汽。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留对雪,地道東北人河狐。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像瑟捣,于是被迫代替她去往敵國和親馋艺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容