版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
go語?框架gin的中??檔安裝與配置安裝:$gogetgopkg.in/gin-gonic/gin.v1注意:確保GOPATHGOROOT已經(jīng)配置導(dǎo)?:import"gopkg.in/gin-gonic/gin.v1"框架架構(gòu)HTTP服務(wù)器1.默認服務(wù)器router.Run()2.HTTP服務(wù)器除了默認服務(wù)器中router.Run()的?式外,還可以?http.ListenAndServe(),?如funcmain(){router:=gin.Default()http.ListenAndServe(":8080",router)}或者?定義HTTP服務(wù)器的配置:funcmain(){router:=gin.Default()s:=&http.Server{Addr:":8080",router,Handler:ReadTimeout:10*time.Second,WriteTimeout:10*time.Second,MaxHeaderBytes:1<<20,}s.ListenAndServe()}3.HTTP服務(wù)器替換?案想?縫重啟、停機嗎?以下有?種?式:我們可以使?來替換默認的ListenAndServe。但是windows不能使?。router:=gin.Default()router.GET("/",handler)//[...]endless.ListenAndServe(":4242",router)除了endless還可以?manners:兼容windowsmanners.ListenAndServe(":8888",r)?命周期Context路由基本路由gin框架中采?的路由庫是httprouter。//創(chuàng)建帶有默認中間件的路由://?志與恢復(fù)中間件router:=gin.Default()//創(chuàng)建不帶中間件的路由://r:=gin.New()router.GET("/someGet",getting)router.POST("/somePost",posting)router.PUT("/somePut",putting)router.DELETE("/someDelete",deleting)router.PATCH("/somePatch",patching)router.HEAD("/someHead",head)router.OPTIONS("/someOptions",options)路由參數(shù)api參數(shù)通過Context的Param?法來獲取router.GET("/string/:name",func(c*gin.Context){name:=c.Param("name")fmt.Println("Hello%s",name)})URL參數(shù)通過DefaultQuery或Query?法獲取//url為http://localhost:8080/welcome?name=ningskyer時//輸出Helloningskyer//url為http://localhost:8080/welcome時//輸出HelloGuestrouter.GET("/welcome",func(c*gin.Context){name:=c.DefaultQuery("name","Guest")//可設(shè)置默認值//是c.Request.URL.Query().Get("lastname")的簡寫lastname:=c.Query("lastname")fmt.Println("Hello%s",name)})表單參數(shù)通過PostForm?法獲取//formrouter.POST("/form",func(c*gin.Context){type:=c.DefaultPostForm("type","alert")//可設(shè)置默認值msg:=c.PostForm("msg")title:=c.PostForm("title")fmt.Println("typeis%s,msgis%s,titleis%s",type,msg,title)})路由群組someGroup:=router.Group("/someGroup"){someGroup.GET("/someGet",getting)someGroup.POST("/somePost",posting)}控制器數(shù)據(jù)解析綁定模型綁定可以將請求體綁定給?個類型,?前?持綁定的類型有JSON,XML和標準表單數(shù)據(jù)(foo=bar&boo=baz)。要注意的是綁定時需要給字段設(shè)置綁定類型的標簽。?如綁定JSON數(shù)據(jù)時,設(shè)置json:"fieldname"。使?綁定?法時,Gin會根據(jù)請求頭中Content-Type來?動判斷需要解析的類型。如果你明確綁定的類型,你可以不??動推斷,??BindWith?法。你也可以指定某字段是必需的。如果?個字段被binding:"required"修飾?值卻是空的,請求會失敗并返回錯誤。//BindingfromJSONtypeLoginstruct{Userstring`form:"user"json:"user"binding:"required"`Passwordstring`form:"password"json:"password"binding:"required"`}funcmain(){router:=gin.Default()//綁定JSON的例?({"user":"manu","password":"123"})router.POST("/loginJSON",func(c*gin.Context){varjsonLoginifc.BindJSON(&json)==nil{ifjson.User=="manu"&&json.Password=="123"{c.JSON(http.StatusOK,gin.H{"status":"youareloggedin"})}else{c.JSON(http.StatusUnauthorized,gin.H{"status":"unauthorized"})}}})//綁定普通表單的例?(user=manu&password=123)router.POST("/loginForm",func(c*gin.Context){varformLogin//根據(jù)請求頭中content-type?動推斷.ifc.Bind(&form)==nil{ifform.User=="manu"&&form.Password=="123"{c.JSON(http.StatusOK,gin.H{"status":"youareloggedin"})}else{c.JSON(http.StatusUnauthorized,gin.H{"status":"unauthorized"})}}})//綁定多媒體表單的例?(user=manu&password=123)router.POST("/login",func(c*gin.Context){varformLoginForm//你可以顯式聲明來綁定多媒體表單://c.BindWith(&form,binding.Form)//或者使??動推斷:ifc.Bind(&form)==nil{ifform.User=="user"&&form.Password=="password"{c.JSON(200,gin.H{"status":"youareloggedin"})}else{c.JSON(401,gin.H{"status":"unauthorized"})}}})//Listenandserveon:8080router.Run(":8080")}請求請求頭請求參數(shù)Cookies上傳?件router.POST("/upload",func(c*gin.Context){file,header,err:=c.Request.FormFile("upload")filename:=header.Filenamefmt.Println(header.Filename)out,err:=os.Create("./tmp/"+filename+".png")iferr!=nil{log.Fatal(err)}deferout.Close()_,err=io.Copy(out,file)iferr!=nil{log.Fatal(err)}})響應(yīng)響應(yīng)頭附加Cookie字符串響應(yīng)c.String(http.StatusOK,"somestring")JSON/XML/YAML響應(yīng)r.GET("/moreJSON",func(c*gin.Context){//Youalsocanuseastructvarmsgstruct{Namestring`json:"user"xml:"user"`MessagestringNumberint}msg.Name="Lena"msg.Message="hey"msg.Number=123//注意msg.Name變成了"user"字段//以下?式都會輸出:{"user":"Lena","Message":"hey","Number":123}c.JSON(http.StatusOK,gin.H{"user":"Lena","Message":"hey","Number":123})c.XML(http.StatusOK,gin.H{"user":"Lena","Message":"hey","Number":123})c.YAML(http.StatusOK,gin.H{"user":"Lena","Message":"hey","Number":123})c.JSON(http.StatusOK,msg)c.XML(http.StatusOK,msg)c.YAML(http.StatusOK,msg)})視圖響應(yīng)先要使?LoadHTMLTemplates()?法來加載模板?件funcmain(){router:=gin.Default()//加載模板router.LoadHTMLGlob("templates/*")//router.LoadHTMLFiles("templates/template1.html","templates/template2.html")//定義路由router.GET("/index",func(c*gin.Context){//根據(jù)完整?件名渲染模板,并傳遞參數(shù)c.HTML(http.StatusOK,"index.tmpl",gin.H{"title":"Mainwebsite",})})router.Run(":8080")}模板結(jié)構(gòu)定義<html><h1>{{.title}}</h1></html>不同?件夾下模板名字可以相同,此時需要LoadHTMLGlob()加載兩層模板路徑router.LoadHTMLGlob("templates/**/*")router.GET("/posts/index",func(c*gin.Context){c.HTML(http.StatusOK,"posts/index.tmpl",gin.H{"title":"Posts",})c.HTML(http.StatusOK,"users/index.tmpl",gin.H{"title":"Users",})}templates/posts/index.tmpl<!--注意開頭define與結(jié)尾end不可少-->{{define"posts/index.tmpl"}}<html><h1>{{.title}}</h1></html>{{end}}gin也可以使??定義的模板引擎,如下```goimport"html/template"funcmain(){router:=gin.Default()html:=template.Must(template.ParseFiles("file1","file2"))router.SetHTMLTemplate(html)router.Run(":8080")}?件響應(yīng)//獲取當前?件的相對路徑router.Static("/assets","./assets")//router.StaticFS("/more_static",http.Dir("my_file_system"))//獲取相對路徑下的?件router.StaticFile("/favicon.ico","./resources/favicon.ico")重定向r.GET("/redirect",func(c*gin.Context){//?持內(nèi)部和外部的重定向c.Redirect(http.StatusMovedPermanently,"/")})同步異步goroutine機制可以?便地實現(xiàn)異步處理funcmain(){r:=gin.Default()//1.異步r.GET("/long_async",func(c*gin.Context){//goroutine中只能使?只讀的上下?c.Copy()cCp:=c.Copy()gofunc(){time.Sleep(5*time.Second)//注意使?只讀上下?log.Println("Done!inpath"+cCp.Request.URL.Path)}()})//2.同步r.GET("/long_sync",func(c*gin.Context){time.Sleep(5*time.Second)//注意可以使?原始上下?log.Println("Done!inpath"+c.Request.URL.Path)})//Listenandserveon:8080r.Run(":8080")}視圖傳參視圖組件中間件分類使??式//1.全局中間件router.Use(gin.Logger())router.Use(gin.Recovery())//2.單路由的中間件,可以加任意多個router.GET("/benchmark",MyMiddelware(),benchEndpoint)//3.群組路由的中間件authorized:=router.Group("/",MyMiddelware())//或者這樣?:authorized:=router.Group("/")authorized.Use(MyMiddelware()){authorized.POST("/login",loginEndpoint)}?定義中間件//定義funcLogger()gin.HandlerFunc{returnfunc(c*gin.Context){t:=time.Now()//在gin上下?中定義變量c.Set("example","12345")//請求前c.Next()//處理請求//請求后latency:=time.Since(t)log.Print(latency)//accessthestatuswearesendingstatus:=c.Writer.Status()log.Println(status)}}//使?funcmain(){r:=gin.New()r.Use(Logger())r.GET("/test",func(c*gin.Context){//獲取gin上下?中的變量example:=c.MustGet("example").(string)//會打印:"12345"log.Println(example)})//監(jiān)聽運?于:8080r.Run(":8080")}中間件參數(shù)內(nèi)置中間件1.簡單認證BasicAuth//模擬私有數(shù)據(jù)varsecrets=gin.H{"foo":gin.H{"email":"foo@","phone":"123433"},"austin":gin.H{"email":"austin@","phone":"666"},"lena":gin.H{"email":"lena@","phone":"523443"},}funcmain(){r:=gin.Default()//使?gin.BasicAuth中間件,設(shè)置授權(quán)?戶authorized:=r.Group("/admin",gin.BasicAuth(gin.Accounts{"foo":"bar","austin":"1234","lena":"hello2","manu":"4321",}))//定義路由authorized.GET("/secrets",func(c*gin.Context){//獲取提交的?戶名(AuthUserKey)user:=c.MustGet(gin.AuthUserKey).(string)ifsecret,ok:=secrets[user];ok{c.JSON(http.StatusOK,gin.H{"user":user,"secret":secret})}else{c.JSON(http.StatusOK,gin.H{"user":user,"secret":"NOSECRET:("})}})//Listenandserveon:8080r.Run(":8080")}2.數(shù)據(jù)庫MongodbGolang常?的Mongodb驅(qū)動為mgo.v2,mgo使
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度智能家居音響系統(tǒng)與家裝室內(nèi)裝修合同9篇
- 二零二五版大理石瓷磚研發(fā)與銷售合作合同范本3篇
- 二零二五版民營企業(yè)股權(quán)激勵合同書3篇
- 教育局教師幼兒園專項2025年度勞動合同規(guī)范文本3篇
- 二零二五年銷售代理合同:汽車銷售代理及區(qū)域獨家合作協(xié)議2篇
- 2025年科技孵化器場地租賃保證金合同范本2篇
- 二零二五版39上公司兜底協(xié)議:綠色環(huán)保項目投資風(fēng)險控制合同3篇
- 二零二五年度鋼箱梁橋工程施工廢棄物處理與回收利用合同3篇
- 二零二五版綠色建筑項目基礎(chǔ)勞務(wù)分包合同2篇
- 二零二五年度高速公路隧道防雷安全防護合同3篇
- Android移動開發(fā)基礎(chǔ)案例教程(第2版)完整全套教學(xué)課件
- 醫(yī)保DRGDIP付費基礎(chǔ)知識醫(yī)院內(nèi)培訓(xùn)課件
- 專題12 工藝流程綜合題- 三年(2022-2024)高考化學(xué)真題分類匯編(全國版)
- DB32T-經(jīng)成人中心靜脈通路裝置采血技術(shù)規(guī)范
- 【高空拋物侵權(quán)責(zé)任規(guī)定存在的問題及優(yōu)化建議7100字(論文)】
- TDALN 033-2024 學(xué)生飲用奶安全規(guī)范入校管理標準
- 物流無人機垂直起降場選址與建設(shè)規(guī)范
- 冷庫存儲合同協(xié)議書范本
- AQ/T 4131-2023 煙花爆竹重大危險源辨識(正式版)
- 武術(shù)體育運動文案范文
- 設(shè)計服務(wù)合同范本百度網(wǎng)盤
評論
0/150
提交評論